[英]Is it possible to implement sumo logic in .net framework 4.5 with Console app? If yes how can we implement
[英]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.