c# - 如何在 C# 控制台应用程序、.NET 4.5 中实现并发调用?

标签 c# asynchronous parallel-processing

我正在轮询外部队列以查找作业请求,然后处理该作业(大约需要 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/

相关文章:

java - java背景下在node中的思考

go - 在后台执行命令

c# - Cannon 的矩阵乘法算法

c++ - CUDA 的总线程数(随时间执行,非并行)是多少?

c# - 如何使用c#关闭外部应用程序

c# - linq-to-xml 的问题

c# - 我应该在内存流上使用异步 I/O 吗?

javascript - 与 javascript 中的 promise /链式函数有点混淆

c# - 为什么 Java 有虚拟扩展方法而不是像 C# 那样有静态扩展方法?

c# - 如何加快循环百万值数组的过程?