System.Threading.Tasks.Task
Konstruktor tertentu menggunakan CancellationToken
sebagai parameter:
CancellationTokenSource source = new CancellationTokenSource();
Task t = new Task (/* method */, source.Token);
Apa yang membuat saya bingung tentang ini adalah bahwa tidak ada cara dari dalam tubuh metode untuk benar-benar mendapatkan token yang disahkan (misalnya, tidak seperti Task.CurrentTask.CancellationToken
). Token harus disediakan melalui beberapa mekanisme lain, seperti objek negara atau ditangkap dalam lambda.
Jadi tujuan apa yang menyediakan token pembatalan dalam melayani konstruktor?
Parallel.For
atauParallel.ForEach
Konstruktor menggunakan token untuk penanganan pembatalan secara internal. Jika kode Anda ingin akses ke token, Anda bertanggung jawab untuk meneruskannya sendiri. Saya akan sangat menyarankan membaca Pemrograman Paralel dengan buku Microsoft .NET di CodePlex .
Contoh penggunaan CTS dari buku:
sumber
token.ThrowIfCancellationRequested();
? Dalam pengujian saya, perilakunya sama. Ada ide?when cts.Cancel() is called the Task is going to get canceled and end, no matter what you do
nggak. Jika Tugas dibatalkan sebelum dimulai, maka dibatalkan . Jika badan Tugas tidak pernah memeriksa token apa pun, itu akan berjalan sampai selesai, menghasilkan status RanToCompletion . Jika tubuh melemparOperationCancelledException
, misalnya denganThrowIfCancellationRequested
, maka Tugas akan memeriksa apakah PembatalanToken Pengecualian itu sama dengan yang terkait dengan Tugas. Jika ya, tugas dibatalkan . Jika tidak, itu menyalahkan .Pembatalan bukanlah perkara sederhana seperti yang mungkin dipikirkan banyak orang. Beberapa seluk-beluk dijelaskan dalam posting blog ini di msdn:
Sebagai contoh:
Pembatalan dalam Ekstensi Paralel
sumber
Berikut adalah contoh yang menunjukkan dua poin dalam jawaban oleh Max Galkin :
Keluaran:
sumber