Lebih
Bagaimana untuk membatalkan Tugas dalam menunggu?
I'm bermain dengan Windows 8 WinRT tugas, dan I'm mencoba untuk membatalkan tugas menggunakan metode di bawah ini, dan ia bekerja untuk beberapa titik. Yang CancelNotification metode TIDAK bisa disebut, yang membuat anda berpikir tugas itu dibatalkan, tetapi di latar belakang tugas terus berjalan, kemudian setelah itu's selesai, status Tugas selalu selesai dan tidak pernah dibatalkan. Apakah ada cara untuk benar-benar menghentikan tugas yang ketika itu's dibatalkan?
private async void TryTask()
{
CancellationTokenSource source = new CancellationTokenSource();
source.Token.Register(CancelNotification);
source.CancelAfter(TimeSpan.FromSeconds(1));
var task = Task<int>.Factory.StartNew(() => slowFunc(1, 2), source.Token);
await task;
if (task.IsCompleted)
{
MessageDialog md = new MessageDialog(task.Result.ToString());
await md.ShowAsync();
}
else
{
MessageDialog md = new MessageDialog("Uncompleted");
await md.ShowAsync();
}
}
private int slowFunc(int a, int b)
{
string someString = string.Empty;
for (int i = 0; i < 200000; i++)
{
someString += "a";
}
return a + b;
}
private void CancelNotification()
{
}
147
4
Baca di Pembatalan (yang diperkenalkan pada .NET 4.0 dan sebagian besar tidak berubah sejak itulah) dan Tugas Berbasis Asynchronous Pola, yang menyediakan panduan tentang bagaimana untuk menggunakan
CancellationToken
denganasync
metode.Untuk meringkas, anda melewati
CancellationToken
ke masing-masing metode yang mendukung pembatalan, dan bahwa metode harus memeriksa secara berkala.Atau, dalam rangka untuk menghindari memodifikasi
slowFunc
(mengatakan anda don't memiliki akses ke kode sumber untuk contoh):Anda juga dapat menggunakan baik metode ekstensi dari https://github.com/StephenCleary/AsyncEx dan itu terlihat sederhana seperti:
Salah satu kasus yang belum't telah tertutup adalah bagaimana untuk menangani pembatalan dalam sebuah metode async. Ambil contoh kasus sederhana di mana anda perlu untuk meng-upload beberapa data untuk mendapatkan layanan ini untuk menghitung sesuatu dan kemudian kembali beberapa hasil.
Jika anda ingin mendukung pembatalan maka cara termudah adalah untuk lulus dalam token dan memeriksa apakah itu telah dibatalkan antara masing-masing metode async panggilan (atau menggunakan ContinueWith). Jika mereka sangat lama menjalankan panggilan meskipun anda bisa menunggu beberapa saat untuk membatalkan. Saya dibuat sedikit helper metode untuk bukan gagal segera dibatalkan.
Jadi untuk menggunakannya maka tambahkan saja
.WaitOrCancel(token)
untuk setiap async hubungi:Catatan bahwa ini tidak akan menghentikan Tugas anda sedang menunggu dan akan terus berjalan. Anda'll harus menggunakan mekanisme yang berbeda untuk menghentikannya, seperti
CancelAsync
panggilan di contoh, atau lebih baik lagi lulus dalam samaCancellationToken
untukTugas
sehingga dapat menangani pembatalan akhirnya. Mencoba untuk membatalkan thread isn't direkomendasikan.Saya hanya ingin menambahkan untuk yang sudah diterima menjawab. Aku terjebak pada hal ini, tapi aku akan pergi rute yang berbeda pada penanganan peristiwa yang lengkap. Daripada berjalan menunggu, saya menambahkan melengkapi verifikasi identitas handler untuk tugas.
Dimana event handler terlihat seperti ini
Dengan rute ini, semua penanganan sudah dilakukan untuk anda, ketika tugas yang dibatalkan itu hanya memicu event handler dan anda dapat melihat apakah itu dibatalkan di sana.