อะไรคือความแตกต่างระหว่าง Nested Task และ 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 );
});

ที่นี่ฉันได้แนบรหัส

ดูเหมือนว่าเมื่อเราเริ่มงานที่ซ้อนกัน งานภายนอกอาจจะเสร็จก่อนงานภายใน แต่ในกรณีของงานลูก งานลูกจะต้องเสร็จก่อนงานหลักเสมอ ฉันไม่แน่ใจว่าฉันพูดถูกหรือไม่ ดังนั้นจะมีประโยชน์มากหากใครก็ตามแนะนำฉันว่าเมื่อใดควรทำงานแบบซ้อนและเมื่อใดควรทำงานย่อยพร้อมสถานการณ์ตัวอย่าง ขอบคุณ


person Thomas    schedule 18.11.2013    source แหล่งที่มา


คำตอบ (3)


Microsoft อธิบายสิ่งนี้อย่างดี

งานที่ซ้อนกันเป็นเพียงอินสแตนซ์งานที่สร้างขึ้นในผู้รับมอบสิทธิ์ผู้ใช้ของงานอื่น งานลูกเป็นงานที่ซ้อนกันที่สร้างขึ้นด้วยตัวเลือก AttachedToParent งานอาจสร้างงานย่อยและ/หรืองานซ้อนจำนวนเท่าใดก็ได้ ซึ่งจำกัดโดยทรัพยากรระบบเท่านั้น ตัวอย่างต่อไปนี้แสดงงานหลักที่สร้างงานซ้อนแบบธรรมดาหนึ่งงาน

...

จุดที่สำคัญที่สุดเกี่ยวกับงานย่อยและงานที่ซ้อนกันคืองานที่ซ้อนกันโดยพื้นฐานแล้วจะเป็นอิสระจากงานหลักหรืองานภายนอก ในขณะที่งานย่อยที่แนบมานั้นจะมีการซิงโครไนซ์กับงานหลักอย่างใกล้ชิดมาก

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

person Gusdor    schedule 18.11.2013
comment
ฉันดีใจที่คุณต่อท้ายส่วนที่สองนั้น เพราะส่วนแรกอธิบายรหัสผู้ถามโดยพื้นฐานแล้ว - person Ondrej Janacek; 18.11.2013
comment
@OndrejJanacek ฉันชอบคิดว่าลิงก์ไปยังเอกสารอย่างเป็นทางการเพียงอย่างเดียวก็เพียงพอแล้ว ฉันใส่เครื่องหมายคำพูดเพื่อปัดเป่าเท่านั้น: D - person Gusdor; 18.11.2013
comment
การโพสต์แค่ลิงก์ก็ขี้เกียจ :) การระบุส่วนสำคัญจากลิงก์นั้นเป็นหนทางหนึ่งอย่างแน่นอน - person Ondrej Janacek; 18.11.2013
comment
@OndrejJanacek บทความที่เชื่อมโยงกำหนดเป้าหมายไปที่คำถามนี้โดยเฉพาะ มันมีความเกี่ยวข้องทั้งหมด เป็นกรณีที่หายากจริงๆ! ฉันมักจะเห็นด้วยว่าการแยกเนื้อจะทำให้ OP มีคำตอบที่กระชับและทำให้ข้อมูลของฉันดูเป็นมืออาชีพด้วยมาร์กอัปที่ไม่เก๋า ;) - person Gusdor; 18.11.2013

IMO คำอธิบายที่ดีที่สุดมีอยู่ใน โพสต์บนบล็อกของ Stephen Toub:

... งานที่กำลังสร้างจะลงทะเบียนกับงานหลักนั้นในฐานะลูก ซึ่งนำไปสู่พฤติกรรมเพิ่มเติมสองประการ: งานหลักจะไม่เปลี่ยนเป็นสถานะเสร็จสมบูรณ์จนกว่างานลูกทั้งหมดจะเสร็จสิ้นเช่นกัน, และข้อยกเว้นใดๆ จากลูกที่มีข้อบกพร่องจะแพร่กระจายไปยังงานหลัก (เว้นแต่ว่างานหลักจะสังเกตข้อยกเว้นเหล่านั้นก่อนที่จะเสร็จสิ้น)

person noseratio    schedule 18.11.2013
comment
+1 สำหรับคำตอบที่ระบุถึงความแตกต่างที่จับต้องได้จริงในพฤติกรรม (และลิงก์ไปยังโพสต์บล็อกที่อธิบายรายละเอียดและสาธิต) มีประโยชน์มากกว่าคำคลุมเครือที่ประสานอย่างใกล้ชิดกับวลีหลักที่พบในคำตอบอื่น ๆ - person TypeIA; 08.07.2017

ง่าย ๆ ถ้างานลูกหนึ่งไม่ได้แนบกับพาเรนต์งานนั้นจะล้มเหลวใช่ไหม จากนั้นสถานะงานหลักจะยังคงเป็น "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);
});
person user3761555    schedule 11.10.2018