Mendaftarkan panggilan balik untuk permintaan pembatalan
Pelajari cara mendaftarkan delegasi yang akan dipanggil saat IsCancellationRequested properti menjadi benar. Nilai berubah dari false menjadi true saat panggilan ke Cancel pada objek yang membuat token telah dibuat. Gunakan teknik ini untuk membatalkan operasi asinkron yang tidak secara asli mendukung kerangka kerja pembatalan terpadu, serta untuk membuka blokir metode yang mungkin menunggu operasi asinkron selesai.
Catatan
Saat "Hanya Kode Saya" diaktifkan, Visual Studio dalam beberapa kasus akan terputus pada baris yang melemparkan pengecualian dan menampilkan pesan kesalahan yang mengatakan "pengecualian tidak ditangani oleh kode pengguna." Kesalahan ini tidak berbahaya. Anda dapat menekan F5 untuk melanjutkannya, dan melihat perilaku penanganan pengecualian yang ditunjukkan dalam contoh di bawah ini. Untuk mencegah Visual Studio melanggar kesalahan pertama, cukup hapus centang pada kotak centang "Hanya Kode Saya" di bawah Alat, Opsi, Penelusuran Kesalahan, Umum.
Contoh
Dalam contoh berikut, metode CancelAsync terdaftar sebagai metode yang akan dipanggil ketika pembatalan diminta melalui token pembatalan.
using System;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
class CancelWithCallback
{
static void Main()
{
using var cts = new CancellationTokenSource();
var token = cts.Token;
_ = Task.Run(async () =>
{
using var client = new WebClient();
client.DownloadStringCompleted += (_, args) =>
{
if (args.Cancelled)
{
Console.WriteLine("The download was canceled.");
}
else
{
Console.WriteLine("The download has completed:\n");
Console.WriteLine($"{args.Result}\n\nPress any key to continue.");
}
};
if (!token.IsCancellationRequested)
{
using CancellationTokenRegistration ctr = token.Register(() => client.CancelAsync());
Console.WriteLine("Starting request\n");
await client.DownloadStringTaskAsync(new Uri("http://www.contoso.com"));
}
}, token);
Console.WriteLine("Press 'c' to cancel.\n\n");
if (Console.ReadKey().KeyChar == 'c')
{
cts.Cancel();
}
Console.WriteLine("\nPress any key to exit.");
Console.ReadKey();
}
}
Imports System.Net
Imports System.Threading
Friend Class CancelWithCallback
Private Shared Sub Main()
Using cts = New CancellationTokenSource()
Dim token = cts.Token
Task.Run(
Async Function()
Using client As New WebClient()
AddHandler client.DownloadDataCompleted,
Sub(__, args)
If args.Cancelled Then
Console.WriteLine("The download was canceled.")
Else
Console.WriteLine($"The download has completed:{vbLf}")
Console.WriteLine($"{args.Result}{vbLf}{vbLf}Press any key to continue.")
End If
End Sub
If Not token.IsCancellationRequested Then
Dim ctr As CancellationTokenRegistration = token.Register(Sub() client.CancelAsync())
Console.WriteLine($"Starting request{vbLf}")
Await client.DownloadStringTaskAsync(New Uri("http://www.contoso.com"))
End If
End Using
End Function, token)
Console.WriteLine($"Press 'c' to cancel.{vbLf}{vbLf}")
If Console.ReadKey().KeyChar = "c"c Then
cts.Cancel()
End If
Console.WriteLine($"{vbLf}Press any key to exit.")
Console.ReadKey()
End Using
End Sub
End Class
Jika pembatalan telah diminta ketika panggilan balik terdaftar, panggilan balik masih dijamin akan dipanggil. Dalam kasus khusus ini, metode CancelAsync ini tidak akan melakukan apa pun jika tidak ada operasi asinkron yang sedang berlangsung, sehingga menjadi selalu aman untuk memanggil metode.