Aracılığıyla paylaş


İptal istekleri için geri çağırmaları kaydetme

Bir özellik doğru olduğunda çağrılacak bir IsCancellationRequested temsilciyi kaydetmeyi öğrenin. Belirteci oluşturan nesne üzerinde çağrısı yapıldığında değer false'tan true'ya Cancel dönüşür. Birleşik iptal çerçevesini yerel olarak desteklemeyen zaman uyumsuz işlemleri iptal etmek ve zaman uyumsuz bir işlemin bitmesi için bekleyen yöntemlerin engelini kaldırmak için bu tekniği kullanın.

Not

"Yalnızca Benim Kodum" etkinleştirildiğinde, bazı durumlarda Visual Studio özel durumu oluşturan satırda kırılır ve "özel durum kullanıcı kodu tarafından işlenmez" hata iletisini görüntüler. Bu hata zararsızdır. F5 tuşuna basarak devam edebilir ve aşağıdaki örneklerde belirtilen özel durum işleme davranışını görebilirsiniz. Visual Studio'nun ilk hatada hata vermesini önlemek için Araçlar, Seçenekler, Hata Ayıklama, Genel altındaki "Yalnızca Kodum" onay kutusunun işaretini kaldırması gerekir.

Örnek

Aşağıdaki örnekte yöntemi, CancelAsync iptal belirteci aracılığıyla iptal istendiğinde çağrılacak yöntem olarak kaydedilir.

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

Geri çağırma kaydedildiğinde iptal zaten istendiyse, geri aramanın yine de çağrılacağı garanti edilir. Bu özel durumda, CancelAsync zaman uyumsuz işlem devam etmiyorsa yöntem hiçbir şey yapmaz, bu nedenle yöntemi çağırmak her zaman güvenlidir.

Ayrıca bkz.