Delen via


Callbacks registreren voor annuleringsaanvragen

Informatie over het registreren van een gemachtigde die wordt aangeroepen wanneer een IsCancellationRequested eigenschap waar wordt. De waarde verandert van onwaar in waar wanneer een aanroep naar Cancel het object dat het token heeft gemaakt, wordt gemaakt. Gebruik deze techniek voor het annuleren van asynchrone bewerkingen die geen systeemeigen ondersteuning bieden voor het geïntegreerde annuleringsframework en voor het opheffen van blokkeringsmethoden die mogelijk wachten tot een asynchrone bewerking is voltooid.

Notitie

Wanneer Just My Code is ingeschakeld, wordt Visual Studio in sommige gevallen verbroken op de regel die de uitzondering genereert en wordt er een foutbericht weergegeven met de tekst 'Uitzondering die niet wordt verwerkt door gebruikerscode'. Deze fout is goedaardig. U kunt op F5 drukken om verder te gaan en het gedrag voor uitzonderingsafhandeling te bekijken dat in de onderstaande voorbeelden wordt gedemonstreerd. Als u wilt voorkomen dat Visual Studio de eerste fout veroorzaakt, schakelt u het selectievakje Just My Code uit onder Extra, Opties, Foutopsporing, Algemeen.

Opmerking

In het volgende voorbeeld wordt de CancelAsync methode geregistreerd als de methode die moet worden aangeroepen wanneer annulering wordt aangevraagd via het annuleringstoken.

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

Als annulering al is aangevraagd wanneer de callback is geregistreerd, wordt de callback nog steeds gegarandeerd aangeroepen. In dit specifieke geval doet de CancelAsync methode niets als er geen asynchrone bewerking wordt uitgevoerd, dus het is altijd veilig om de methode aan te roepen.

Zie ook