簡體   English   中英

C#重用還是重新創建任務?

[英]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.

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