Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Im folgenden Beispiel wird das Registrieren eines Delegaten gezeigt, der aufgerufen wird, wenn eine IsCancellationRequested-Eigenschaft aufgrund eines Aufrufs von Cancel für das Objekt true wird, das das Token erstellt hat. Verwenden Sie dieses Verfahren zum Abbrechen von asynchronen Vorgängen, die das einheitliche Abbruchframework nicht systemintern unterstützen, und zum Aufheben der Blockierung bei Methoden, die möglicherweise auf einen zu beendenden asynchronen Vorgang warten.
Hinweis |
|---|
Wenn "Nur eigenen Code" aktiviert ist, unterbricht Visual Studio die Ausführung in einigen Fällen in der Zeile, die die Ausnahme auslöst, und eine Fehlermeldung zu einer nicht vom Benutzercode behandelten Ausnahme wird angezeigt. Dieser Fehler hat keine Auswirkungen.Sie können F5 drücken, um den Vorgang fortzusetzen. In diesem Fall wird das in den unten stehenden Beispielen veranschaulichte Ausnahmebehandlungsverhalten angewendet.Um zu verhindern, dass Visual Studio die Ausführung beim ersten Fehler unterbricht, deaktivieren Sie das Kontrollkästchen "Nur eigenen Code" unter Extras > Optionen > Debugging > Allgemein. |
Beispiel
Im folgenden Beispiel wird die CancelAsync-Methode als aufzurufende Methode registriert, wenn durch das Abbruchtoken der Abbruch angefordert wird.
Class CancelWithCallback
Shared Sub Main()
Dim cts As New CancellationTokenSource()
' Start cancelable task.
Dim t As Task = Task.Factory.StartNew(Sub() DoWork(cts.Token))
Console.WriteLine("Press 'c' to cancel.")
Dim ch As Char = Console.ReadKey().KeyChar
If ch = "c"c Then
cts.Cancel()
End If
Console.WriteLine("Press any key to exit.")
Console.ReadKey()
End Sub
Shared Sub DoWork(ByVal token As CancellationToken)
Dim wc As New WebClient()
' Create an event handler to receive the result.
AddHandler wc.DownloadStringCompleted, Sub(obj, e)
' Checks status of WebClient, not external token
If e.Cancelled = False Then
Console.WriteLine(e.Result + "\r\nPress any key.")
Else
Console.WriteLine("Download was canceled.")
End If
End Sub
token.Register(Sub() wc.CancelAsync())
Console.WriteLine("Starting request")
wc.DownloadStringAsync(New Uri("https://www.contoso.com"))
End Sub
End Class
namespace Cancel3
{
using System;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
class CancelWithCallback
{
static void Main(string[] args)
{
var cts = new CancellationTokenSource();
// Start cancelable task.
Task t = Task.Factory.StartNew(() =>
{
DoWork(cts.Token);
});
Console.WriteLine("Press 'c' to cancel.");
char ch = Console.ReadKey().KeyChar;
if (ch == 'c')
{
cts.Cancel();
}
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
static void DoWork(CancellationToken token)
{
WebClient wc = new WebClient();
// Create an event handler to receive the result.
wc.DownloadStringCompleted += (obj, e) =>
{
// Checks status of WebClient, not external token
if (!e.Cancelled)
{
Console.WriteLine(e.Result + "\r\nPress any key.");
}
else
Console.WriteLine("Download was canceled.");
};
// Do not initiate download if the external token
// has already been canceled.
if (!token.IsCancellationRequested)
{
// Register the callback to a method that can unblock.
// Dispose of the CancellationTokenRegistration object
// after the callback has completed.
using (CancellationTokenRegistration ctr = token.Register(() => wc.CancelAsync()))
{
Console.WriteLine("Starting request");
wc.DownloadStringAsync(new Uri("https://www.contoso.com"));
}
}
}
}
}
Wenn der Abbruch bereits angefordert wurde, wenn der Rückruf registriert wird, wird der Rückruf trotzdem garantiert aufgerufen. In diesem Fall bleibt die CancelAsync-Methode wirkungslos, wenn kein asynchroner Vorgang ausgeführt wird. Das Aufrufen der Methode ist daher immer sicher.
Hinweis