簡體   English   中英

通過新的任務並行庫,如何確保兩個任務在不同的線程甚至不同的處理器上運行?

[英]How can I ensure two tasks are running on different threads or even different processors with the new Task Parallel Library?

我有兩個長期運行的任務,它們同時從網絡流中讀取和寫入數據,這需要我使用兩個不同的線程。
我已將它們標記為可以長時間運行,但是根據將它們標記為可以長期運行的文檔,它僅建議使用,但不能保證它們將在不同的線程上運行。
我需要編寫自己的任務計划程序嗎? 我應該改用線程池嗎?

LongRunning提示它應該在新線程上執行,而不是在ThreadPool中的現有線程上執行。 這樣一來,您就不會因為長時間運行的任務而耗盡ThreadPool。

無法保證無論在TPL中還是在ThreadPool中都不會使用兩個不同的線程。 例如,可能是同一線程同步執行兩個任務。

您是否考慮過使用異步io?

如果“網絡流”表示NetworkStream類,那么我不確定您為什么真正需要兩個單獨的線程。 您是否基於文檔中的以下引用:

“只要有一個用於寫操作的唯一線程和一個用於讀操作的唯一線程,讀和寫線程之間就不會有交叉干擾,並且不需要同步”

如果是這樣,那只是一個建議-他們是說,如果您以這種方式進行操作,則無需進行任何同步。 他們之所以這么說,主要是因為NetworkStream與眾不同,因為它同時支持從兩個線程進行訪問,只要一個線程正在讀取而一個線程正在寫入。

但是從文檔中可以清楚地看到,您還可以選擇執行同步-他們只是說,如果您選擇沿着只有一個讀線程和一個寫線程的路徑進行同步,則沒有必要。

但是,如果由於某種原因您確實確實需要兩個專用線程,那么...我只是使用Thread類。 試圖讓Task為您做到這一點(直接或通過TaskScheduler間接)可能會使事情變得更復雜。 這不會阻止您使用TaskCompletionSource您可以使用TaskCompletionSource創建任務,並TaskCompletionSource完成任務。 (對於要控制任務執行方式但仍將其作為Task對象公開的情況,TCS是正常的解決方案。)

string[] forums = File.ReadAllLines(Environment.CurrentDirectory + @"\forums.txt");

Task[] tasks = new Task[forums.Length ];
int ctr = 0;
DateTime Start = DateTime.Now;`
foreach(string s in forums)`
{
object state = s;
var task = Task.Factory.StartNew(() => DoSomeWork(state),TaskCreationOptions.LongRunning);
tasks[ctr] = task;
ctr++;
}

Task.WaitAll(tasks);
DateTime end = DateTime.Now;
TimeSpan elapsed = end - Start;
string totalMs = elapsed.TotalMilliseconds.ToString();
Console.WriteLine("DONE in " +totalMs + " ms. Any Key to quit.");
Console.ReadKey();

LongRunning枚舉方法重載告訴任務庫為每個任務分配一個線程,而不管它可以使用多少核。

暫無
暫無

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

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