【C#】55. .Net中的并发集合——ConcurrentQueue

这部分内容我觉得可以用在网络爬虫之类的任务上,应该是很有启发的。

客户类型:

class Custom
{
public int Id { get; set; }
}
随机等待时间”任务:
static Task GetRandomDelay()
{
int delay = new Random(DateTime.Now.Millisecond).Next(1, 500);
return Task.Delay(delay);
}


“生成”任务:

static async Task TaskProducer(ConcurrentQueue<Custom> queue)
{
for (int i = 1; i <= 20; i++)
{
await Task.Delay(50);
var workItem = new Custom {Id = i};
queue.Enqueue(workItem);//入列
Console.WriteLine("Task {0} has been posted", workItem.Id);
}
}


“处理”任务:内部使用循环,只要没有获得取消通知,就始终执行。也就是说, 如果没有取消命令,那么他将始终保持准备状态,如果任务都处理完了,则out workItem中返回null,但始终在循环试图TryDequeue

static async Task TaskProcessor(
ConcurrentQueue<Custom> queue, string name, CancellationToken token)
{
Custom workItem;
bool dequeueSuccesful = false;

await GetRandomDelay(); //随机等待一定的时间,模拟处理操作。
do
{
dequeueSuccesful = queue.TryDequeue(out workItem); //注意:这里是按照先进先出次序出队!
if (dequeueSuccesful)
{
Console.WriteLine("Task {0} has been processed by {1}", workItem.Id, name);
}

await GetRandomDelay();
}
while (!token.IsCancellationRequested);
}

主调用函数:

static async Task RunProgram()
{
var taskQueue = new ConcurrentQueue<Custom>();
var cts = new CancellationTokenSource();

//生成任务队列taskQueue
var taskSource = Task.Run(() => TaskProducer(taskQueue));

//使用四个处理任务来处理。
Task[] taskProcessors = new Task[4]; 
for (int i = 1; i <= 4; i++)
{
string processorId = i.ToString();
taskProcessors[i-1] = Task.Run(	() => TaskProcessor(taskQueue, "Processor " + processorId, cts.Token));
}
await taskSource; //等待任务产生完毕
cts.CancelAfter(5000); //两秒钟后取消处理程序

await Task.WhenAll(taskProcessors);//等待四个任务处理程序全部处理完毕
}

Main:

static void Main(string[] args)
{
Task t = RunProgram();
t.Wait();
Console.Read();
}



需要指出的是, 这里的任务都是按照先后进队次序而出队, 进而被处理的。虽然被处理完成的时间并不一定一样(线程的关系以及随机时间等待的原因),但是 被处理次序不变且不会产生矛盾
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值