C# 使用ConcurrentQueue监视任务链
我一直在开发一个系统,该系统处理SQL数据库的大量插入。这些插入的数据是从一系列API中获取的,这使得整个操作有点耗时,而且由于复杂的反序列化而有点繁重。为了提高整个流程的效率,我提出了这样一个想法:将每个API调用的数据处理和插入操作封装到单个任务中,并将每个任务推送到C# 使用ConcurrentQueue监视任务链,c#,task,C#,Task,我一直在开发一个系统,该系统处理SQL数据库的大量插入。这些插入的数据是从一系列API中获取的,这使得整个操作有点耗时,而且由于复杂的反序列化而有点繁重。为了提高整个流程的效率,我提出了这样一个想法:将每个API调用的数据处理和插入操作封装到单个任务中,并将每个任务推送到ConcurrentQueue中,同时监视它们是否完成或失败。为此,我在任务类型周围开发了一个包装器,其中包含一个属于相应数据的可分配Id。我实施了以下监控: while(processes.TryDequeue(out Tas
ConcurrentQueue
中,同时监视它们是否完成或失败。为此,我在任务
类型周围开发了一个包装器,其中包含一个属于相应数据的可分配Id。我实施了以下监控:
while(processes.TryDequeue(out TaskInfo taskInfo))
{
if (!taskInfo.Task.IsCompleted) {
processes.Enqueue(taskInfo);
continue;
}
if (taskInfo.Task.IsCompletedSuccessfully)
{
Console.WriteLine("{0} Completed.", taskInfo.ReferenceId);
}
else {
Console.WriteLine("{0} Failed With {1}.", taskInfo.ReferenceId, trackableTask.Task.Exception.Message);
}
}
如您所见,我不等待任务,而是检查其已完成
状态,如果尚未完成,我将将任务排回队列。我这样做的原因是因为我相信如果我这样做,我可以跳过等待长时间运行的任务,将其移动到集合的末尾,这样我就可以移动到下一个任务,并更快地执行监视过程
我想知道我所做的是否是一种糟糕的方法,尤其是与任务类型中内置的whalll
方法相比。我也不确定我所做的是否正确使用了ConcurrentQueue
类型 由于您仅使用单个线程处理该队列,因此可以使用常规队列。
当您尝试使用多个线程访问队列时,并发队列是有帮助的。例如,队列中的线程:)
在阅读您的代码时,我想知道您是否听说过TPL:
或PLINQ:
这些可能会帮助您完成任务;) 正在从多个线程访问队列吗?看来不是这样。如果没有,您可以(应该)使用普通的旧队列
;否则,每次访问并发队列时,它都会获取不必要的锁TryDequeue
变为Dequeue
(现在在循环中),while循环测试Count>0
@pinkfloydx33:很好!谢谢。@pinkfloydx33:但我仍然可以使用tryDequeue
,你认为使用它会有什么问题吗?你知道tryDequeue是做什么的吗?它适用于(例如)队列中有1个项目,但两个线程同时尝试退出队列的场景。一个将获得该项(并返回true),另一个将什么也得不到(并返回false)。您没有在多线程场景中使用队列,那么TryDequeue给您带来了什么好处?没有什么。相反,它会给您带来不必要的锁定开销,据我所知,Queue
可能在dotnetcore中添加了一个TryDequeue
方法,但没有记录在案(这种情况似乎是基于一些github问题和msdn上没有记录的事实)。添加该Api背后的原因是,如果计数为0,则Dequeue
抛出。因此,您现在可以编写while(queue.TryDequeue(out var item){..}
,而不是while(queue.Count>0){var item=queue.Dequeue();}
。因此…如果TryDequeue
类的成员可以使用。