使用ConcurrentQueue监视一系列任务

时间:2018-08-25 10:05:17

标签: c# task

我一直在研究处理SQL数据库中大量插入队列的系统。这些插入的数据是从一系列API中获取的,由于复杂的反序列化,整个操作非常耗时,而且有点繁重。为了使整个过程更有效率,我想到了将每个API调用的数据处理和插入操作封装到一个Task中,并将每个Task放入ConcurrentQueue的过程,同时监视它们的完成情况或以后失败。为此,我围绕Task类型开发了一个包装器,该包装器具有一个属于其对应数据的可分配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);
    }
}

如您所见,我没有await任务,而是检查其Completed状态,如果尚未完成,则Enqueue返回任务。之所以这样做,是因为我相信如果这样做的话,可以通过将其移至集合的末尾来跳过等待长时间运行的任务,因此我可以移至下一个任务并进行一些监视过程快点。

我想知道我做的是否不好,特别是与任务类型中内置的WhenAll方法相比。我也不确定我是否正确使用了ConcurrentQueue类型。

1 个答案:

答案 0 :(得分:1)

由于仅使用一个线程来处理该队列,因此可以使用常规队列。 当您尝试使用多个线程访问队列时,并发队列会很有帮助。例如,队列中的线程:)

在阅读代码时,我想知道您是否听说过TPL:https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-parallel-library-tpl

或PLINQ: https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/parallel-linq-plinq

这些可能会帮助您完成任务;)