因此,這裏是我的代碼父任務不會等待子任務完成
Task<int[]> parent = Task.Run(() =>
{
var result = new int[3];
TaskFactory tf = new TaskFactory(TaskCreationOptions.AttachedToParent, TaskContinuationOptions.ExecuteSynchronously);
for (int i = 0; i < result.Length; i++)
{
int j = i;
tf.StartNew(() => result[j] = GetRandomNumber(j));
}
return result;
});
var finalTask = parent.ContinueWith(parentTask =>
{
foreach (var i in parentTask.Result)
{
Console.WriteLine(i);
}
});
finalTask.Wait();
基本上我創建3個Task
S的是Task
稱爲父(我猜)的兒童。我不重視父任務,等待所有三個子任務完成。之後finalTask
將由於finalTask.Wait();
這個語句等待執行。但事情並不像預期的那樣發生。我的意思是應用程序在任何GetRandomNumber
調用完成之前退出。這裏的代碼的一部分是從書中複製的,它指出那些父任務應該等待子任務完成,這顯然沒有發生。我在這裏錯過了什麼嗎?
這是getRandomNumber的呢
public static int GetRandomNumber(int ii)
{
Random rand = new Random();
for (int i = 0; i < 1000000000; i++) { } // imitate some jobs
return rand.Next(1000);
}
此代碼做同樣的事情
Task<int[]> parent = Task.Run(() =>
{
var result = new int[3];
for (int i = 0; i < result.Length; i++)
{
int j = i;
new Task(() => result[j] = GetRandomNumber(j), TaskCreationOptions.AttachedToParent).Start();
}
return result;
});
這只是一個例子。 – Dimitri
單步執行代碼,看看它在做什麼。 – SQLMason
GetRandomNumber被命中3次,但該方法的結束從未被擊中 – Dimitri