![](/img/trans.png)
[英]Threads can run on different processors or cores for both Task.Factory.StartNew and Parallel.Invoke
[英]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.