Apa perbedaan antara Tugas Bersarang dan Tugas Anak

saya ingin memahami apa perbedaan antara 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 );
});

di sini saya telah melampirkan kodenya.

tampaknya ketika kita memulai tugas bersarang maka tugas luar dapat diselesaikan sebelum tugas dalam tetapi dalam kasus tugas anak, selalu tugas anak selesai sebelum tugas induk. aku tidak yakin apakah aku benar atau tidak. jadi akan sangat membantu jika ada yang memandu saya kapan harus melakukan tugas bersarang dan kapan tugas anak dengan skenario sampel. terima kasih


person Thomas    schedule 18.11.2013    source sumber


Jawaban (3)


Microsoft menjelaskan hal ini dengan baik.

Tugas bersarang hanyalah sebuah contoh Tugas yang dibuat di delegasi pengguna tugas lain. Tugas anak adalah tugas bertumpuk yang dibuat dengan opsi AttachedToParent. Suatu tugas dapat membuat sejumlah tugas turunan dan/atau tugas bertumpuk, hanya dibatasi oleh sumber daya sistem. Contoh berikut memperlihatkan tugas induk yang membuat satu tugas sederhana bertingkat.

...

Poin paling penting sehubungan dengan tugas anak vs. tugas bersarang adalah bahwa tugas bersarang pada dasarnya independen dari tugas induk atau tugas luar, sedangkan tugas anak terlampir sangat tersinkronisasi dengan induknya.

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

person Gusdor    schedule 18.11.2013
comment
Saya senang Anda menambahkan bagian kedua itu, karena bagian pertama pada dasarnya menjelaskan kode penanya. - person Ondrej Janacek; 18.11.2013
comment
@OndrejJanacek Saya rasa tautan ke dokumentasi resmi saja sudah cukup. Saya hanya menyisipkan kutipan untuk menangkal whinging :D - person Gusdor; 18.11.2013
comment
Memposting hanya sebuah tautan adalah hal yang malas :) Menunjukkan dengan tepat bagian-bagian penting darinya jelas merupakan cara yang tepat. - person Ondrej Janacek; 18.11.2013
comment
@OndrejJanakek Artikel tertaut secara khusus menargetkan pertanyaan ini. Itu semua relevan. Benar-benar sebuah kasus yang jarang terjadi! Namun saya cenderung setuju, mengekstraksi daging memberikan OP jawaban singkat dan membuat masukan saya terlihat profesional dengan markup yang menarik;) - person Gusdor; 18.11.2013

IMO, penjelasan terbaik ada di entri blog Stephen Toub:

... Tugas yang sedang dibuat terdaftar dengan Tugas induk tersebut sebagai anak, yang menyebabkan dua perilaku tambahan: Tugas induk tidak akan bertransisi ke keadaan selesai sampai semua turunannya telah menyelesaikannya juga, dan pengecualian apa pun dari turunan yang salah akan disebarkan ke Tugas induk (kecuali Tugas induk mengamati pengecualian tersebut sebelum selesai).

person noseratio    schedule 18.11.2013
comment
Memberi +1 untuk jawaban yang benar-benar menyatakan perbedaan nyata dalam perilaku (dan tautan ke entri blog yang menguraikan dan mendemonstrasikannya). Jauh lebih berguna daripada frasa samar-samar yang disinkronkan dengan induk yang ditemukan di jawaban lain. - person TypeIA; 08.07.2017

Sederhananya, jika satu tugas anak tidak dilampirkan ke induk, tugas itu gagal? Maka status tugas orang tua akan tetap menjadi "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