簡體   English   中英

嵌套任務和子任務有什么區別

[英]What is the difference between a Nested Task and Child Task

我想了解Nested Task and Child Task之間有什么區別。

var outerTask = Task.Factory.StartNew( () => 
{
    var nestedTask = Task.Factory.StartNew( () => 
    {
         Console.WriteLine("Inside nestedTask");
    });
});


A "child task" looks like this:

var parentTask = Task.Factory.StartNew( () => 
{
    var childTask = Task.Factory.StartNew( () => 
    {
         Console.WriteLine("Inside childTask");
    },               TaskCreationOptions.AttachedToParent );
});

我在這里附上了代碼。

似乎當我們開始任何嵌套任務時,外部任務可能在內部任務之前完成,但在子任務的情況下,子任務總是在父任務之前完成。 我不確定我是否正確。 因此,如果有人指導我何時進行嵌套任務以及何時使用示例場景進行子任務,這將很有幫助。 謝謝

IMO,最好的解釋可以在Stephen Toub 的博客文章中找到

...正在創建的任務在父任務中注冊為子任務,導致兩個額外的行為:父任務在其所有子任務也完成之前不會轉換到完成狀態,並且來自錯誤子任務的任何異常都將傳播到父任務(除非父任務在完成之前觀察到這些異常)。

微軟很好地解釋了這一點。

嵌套任務只是在另一個任務的用戶委托中創建的 Task 實例。 子任務是使用 AttachedToParent 選項創建的嵌套任務。 一個任務可以創建任意數量的子任務和/或嵌套任務,僅受系統資源的限制。 以下示例顯示了一個創建一個簡單嵌套任務的父任務。

...

關於子任務與嵌套任務的最重要的一點是嵌套任務本質上獨立於父任務或外部任務,而附加的子任務與父任務非常緊密地同步。

http://msdn.microsoft.com/en-us/library/vstudio/dd997417%28v=vs.100%29.aspx

很簡單,如果一個子任務沒有附加到父任務,那么該任務會失敗嗎? 那么父任務狀態仍然是“RanToCompletion”

var parentTask = Task.Factory.StartNew(() =>
{
    var childTask = Task.Factory.StartNew(() =>
    {
        Console.WriteLine("Inside childTask");
    }, TaskCreationOptions.AttachedToParent);

    var childTask2 = Task.Factory.StartNew(() =>
    {
        Thread.Sleep(1000 * 3);
        throw new Exception("Bomb2");
        Console.WriteLine("Inside childTask2");
    }, **TaskCreationOptions.None**);   // If not AttachedToParent, parentTask.Status == RanToCompletion
}).ContinueWith(t =>
{
    Console.WriteLine(t.Status);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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