簡體   English   中英

如何在C#控制台應用程序.NET 4.5中實現並發調用?

[英]How to implement concurrent calls in C# console app, .NET 4.5?

我正在輪詢外部隊列以查找作業請求,然后處理作業(大約需要1分鍾)。 目前,我正在同步執行此操作,效率很低,因為如果有10個作業,則將花費10分鍾。 機器最多可以同時處理5個作業,因此它應該能夠在2分鍾左右內處理10個作業。

我從來沒有做過多線程,我試圖閱讀有關異步,等待,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添加和接受作業。 這充當生產者和消費者之間的調解人。

消費者

與生產者完全相同-一個單獨的Thread ,檢查共享內存中是否有任何可用項。 從隊列中檢索到項目后,您可以隨意處理它。


現在,如果您有這種分離,則可以輕松生成多個生產者和使用者,每個生產者和使用者在各自的線程中運行。

您是否曾經嘗試過並聯? 這很簡單。

這是一個MSDN 示例

Parallel.ForEach(concurrentJobs , currentJob =>
{
    processJob(currentJob);
});

Romulo的答案類似,但充實了一些。

首先,您需要將pollForJob()函數轉換為IEnumerable

private IEnumerable<Job> JobEnumerator()
{
   Job job;
   while((job = pollForJob()) != null)
   {
       yield return job;
   }
}

然后可以將其與Parallel.ForEach類一起使用

Parallel.ForEach(JobEnumerator(), 
         new ParallelOptions() {MaxDegreeOfParallelism = 5}, 
         processJob);

這將阻塞Parallel.ForEach行,但是它將同時運行5個processJob(Job job)函數實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM