背景:繼續任務上的Task.WaitAll()只會延遲原始任務的執行嗎?
我有它創建Tasks
處理來自DB數據控制檯應用程序(我們姑且稱之爲1級任務)。每個任務都會再次創建自己的任務來處理分配給它的每個數據部分(Level2任務)。
每個Level2任務都有一個與其關聯的繼續任務,並且在繼續前面的任務中用於對繼續任務執行WaitAll的代碼。
我在.NET 4.0
(無異步/等待)
問題:
這創造了一個問題 - 事實證明,如果做到這樣,沒有任何的Level2的任務是之前啓動所有可用的Level1任務都已安排。這在任何方面都不是最佳的。
問:
這似乎是固定更改代碼等針對原始Level2的任務和它的後續任務。但是,我不完全確定爲什麼會出現這種情況?
你有什麼想法嗎?
我唯一能想出來的就是 - 由於延續任務尚未開始,因此等待它完成沒有意義?但即使如此,我預計至少有一些Level2任務已經開始。他們從未做過。
例子:
我創建了一個證明正是行爲的示例控制檯應用程序:
運行它當作是,你會發現它的第一個調度的所有任務,然後才你開始從Level2任務中獲取實際的書籤。
但註釋掉標記的代碼塊並取消註釋替換,並按預期工作。
你能告訴我爲什麼嗎?
public class Program
{
static void Main(string[] args)
{
for (var i = 0; i < 100; i++)
{
Task.Factory.StartNew(() => SomeMethod());
//Thread.Sleep(1000);
}
Console.ReadLine();
}
private static void SomeMethod()
{
var numbers = new List<int>();
for (var i = 0; i < 10; i++)
{
numbers.Add(i);
}
var tasks = new List<Task>();
foreach (var number in numbers)
{
Console.WriteLine("Before start task");
var numberSafe = number;
/* Code to be replaced START */
var nextTask = Task.Factory.StartNew(() =>
{
Console.WriteLine("Got number: {0}", numberSafe);
})
.ContinueWith(task =>
{
Console.WriteLine("Continuation {0}", task.Id);
});
tasks.Add(nextTask);
/* Code to be replaced END */
/* Replacement START */
//var originalTask = Task.Factory.StartNew(() =>
//{
// Console.WriteLine("Got number: {0}", numberSafe);
//});
//var contTask = originalTask
// .ContinueWith(task =>
// {
// Console.WriteLine("Continuation {0}", task.Id);
// });
//tasks.Add(originalTask);
//tasks.Add(contTask);
/* Replacement END */
}
Task.WaitAll(tasks.ToArray());
}
}
你必須使用'ContinueWith',還是可以使用'async/await'? – Noseratio
@Noseratio - 它是.NET 4.0 - 沒有異步/等待 –
如果你使用VS2012 +,你仍然可以使用.NET 4.0:http://stackoverflow.com/tags/async-await/info – Noseratio