[英]C# Re-use or re-create tasks?
我有一個while循環,可在其中創建和啟動任務,如下所示:
while (!stopped)
{
List<Task> tasks = new List<Task>();
for (int i = 0; i < 10; i++)
tasks.add(Task.Factory.StartNew(() => DoSomething(i)));
Task.WaitAll(tasks.ToArray());
}
如果在while循環之前創建一次任務,然后每次都重新啟動(因為傳遞給函數的數據永遠不會改變),我會得到更好的性能嗎?
您不能重啟任務http://msdn.microsoft.com/en-us/library/dd270682.aspx
Task.Factory.StartNew(() => {....})
比
Task task = new Task(() => {...});
task.Start();
因為沒有鎖定Start方法。
在您的情況下,請使用async io來提高性能。
您的代碼從根本上沒有錯。 這是一個完全可以接受的方法。 您無需擔心創建任務的性能或成本,因為TPL是專門為完全按照您的使用目的而設計的。
然而,有一個與你的代碼的一個主要問題。 您正在關閉循環變量 。 請記住,閉包捕獲變量而不是value 。 代碼的編寫方式DoSomething
方法不會使用您認為應該的i
值。 您的代碼需要像這樣重寫。
while(!stopped){列表任務=新的List();
for (int i = 0; i < 10; i++)
{
int capture = i;
tasks.add(Task.Factory.StartNew(() => DoSomething(capture)));
}
Task.WaitAll(tasks.ToArray());
}
附帶說明一下,您可以使用Parallel.For
方法作為替代方法。 如果沒有別的,那肯定是解決方案的緊湊得多。
while (!stopped)
{
Parallel.For(0, 10, i => DoSomething(i));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.