C# 使用ConcurrentQueue监视任务链

C# 使用ConcurrentQueue监视任务链,c#,task,C#,Task,我一直在开发一个系统,该系统处理SQL数据库的大量插入。这些插入的数据是从一系列API中获取的,这使得整个操作有点耗时,而且由于复杂的反序列化而有点繁重。为了提高整个流程的效率,我提出了这样一个想法:将每个API调用的数据处理和插入操作封装到单个任务中,并将每个任务推送到ConcurrentQueue中,同时监视它们是否完成或失败。为此,我在任务类型周围开发了一个包装器,其中包含一个属于相应数据的可分配Id。我实施了以下监控: while(processes.TryDequeue(out Tas

我一直在开发一个系统,该系统处理SQL数据库的大量插入。这些插入的数据是从一系列API中获取的,这使得整个操作有点耗时,而且由于复杂的反序列化而有点繁重。为了提高整个流程的效率,我提出了这样一个想法:将每个API调用的数据处理和插入操作封装到单个任务中,并将每个任务推送到
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
类的成员可以使用