簡體   English   中英

為什么父任務在他的子任務之前完成?

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

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