[英]Why parent task finishes before his children tasks?
在我的代碼中,父任務在他的子任務之前完成。 為什么會發生?
我認為父任務不應該在子任務完成之前完成。
我的代碼:
var parent = Task.Run(() =>
{
int[] tab = new int[3];
new Task(() =>
{
tab[0] = 9;
Thread.Sleep(4000);
Console.WriteLine("Child1");
}, TaskCreationOptions.AttachedToParent).Start();
new Task(() =>
{
tab[1] = 2;
Thread.Sleep(2000);
Console.WriteLine("Child2");
}, TaskCreationOptions.AttachedToParent).Start();
new Task(() =>
{
tab[2] = 3;
Thread.Sleep(1000);
Console.WriteLine("Child3");
}, TaskCreationOptions.AttachedToParent).Start();
Console.WriteLine("I am here");
return tab;
});
var finalTask = parent.ContinueWith((a) =>
{
a.Result.ToList().ForEach(Console.WriteLine);
});
finalTask.Wait();
Console.WriteLine("Out of threads");
Console.ReadLine();
結果:
我在這里
9
2
3
線程不足
孩子 3 孩子 2
孩子1
我想,我找到了一個原因:“如果子任務是通過調用Task.Run
方法創建的,則父任務會隱式阻止子任務附加到它們。” 所以,我不應該使用Task.Run()
,我應該使用Task.Factory.StartNew()
代替。
因為您不是通過調用parent.Wait();
等待parent
任務parent.Wait();
. 有關更多信息,請參閱附加和分離的子任務。 特別是顯示的示例。
盡管使用Task.Factory.StartNew()
和TaskCreationOptions.AttachedToParent
選項是將子線程與父線程連接的最佳選擇。 但另一種方法可能是在父線程函數中使用Task.WaitAll
。 唯一的優點是可以使用WaitAll
timeout
時間。
可以將塊重寫為:
var parent = Task.Run(() =>
{
int[] tab = new int[3];
var child1 = Task.Run(() =>
{
tab[0] = 9;
Thread.Sleep(4000);
Console.WriteLine("Child1");
});
var child2 = Task.Run(() =>
{
tab[1] = 2;
Thread.Sleep(2000);
Console.WriteLine("Child2");
});
var child3 = Task.Run(() =>
{
tab[2] = 3;
Thread.Sleep(1000);
Console.WriteLine("Child3");
});
Task.WaitAll(child1, child2, child3); //Wait for all 3 threads to complete.
Console.WriteLine("I am here");
return tab;
});
var finalTask = parent.ContinueWith((a) =>
{
a.Result.ToList().ForEach(Console.WriteLine);
});
finalTask.Wait();
Console.WriteLine("Out of threads");
Console.ReadLine();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.