我正在轮询外部队列以查找作业请求,然后处理该作业(大约需要 1 分钟)。目前,我正在同步执行此操作,效率很低,因为如果有 10 个作业,则需要 10 分钟。该机器最多可以同时处理 5 个作业,因此它应该能够在大约 2 分钟内处理 10 个作业。
我从未做过多线程,我尝试阅读有关 async、await、Task.Run 的内容,但没有成功实现它。关于实现此伪代码的简单方法有什么建议吗?
while(concurrentJobs <= 5)
{
job = pollForJob(); // synchronous
processJob(job); // want to do this in background so that I can poll for next job
}
void processJob(job)
{
concurrentJobs++;
doStuff(); // takes 1 minute
concurrentJobs--;
}
最佳答案
看起来您有一个生产者-消费者模型。在这种情况下,Parallel
类对您没有任何好处,因为新工作随时可能出现。只有当您事先知道需要做什么时,您才能使用Parallel
类。
但是,如果随时有新工作,我会使用以下方法。
制作人
编写一个单独的长时间运行的Task
或使用Thread
。该线程从网络(例如从队列或数据库)或其他任何地方接收作业,并将项目放入共享内存中。
共享内存
使用BlockingCollection
添加和获取作业。它充当生产者和消费者之间的中介。
消费者
与生产者完全相同 - 一个单独的线程
,用于检查共享内存中是否有任何可用项目。从队列中检索到项目后,您可以随意处理它。
现在,如果您有这样的分离,您可以轻松地生成多个生产者和消费者,每个生产者和消费者都在自己的线程中运行。
关于c# - 如何在 C# 控制台应用程序、.NET 4.5 中实现并发调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18644202/