Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Узнайте, как зарегистрировать делегат, который будет вызываться, когда IsCancellationRequested свойство становится истинным. Значение изменяется с false на true при вызове Cancel для объекта, который создал маркер. Используйте этот метод для отмены асинхронных операций, которые изначально не поддерживают единую платформу отмены, а также для разблокировки методов, которые могут ожидать завершения асинхронной операции.
Замечание
Если включен параметр "Just My Code", Visual Studio в некоторых случаях остановится на строке, которая вызывает исключение, и выведет сообщение об ошибке "исключение не обработано пользовательским кодом". Эта ошибка безвредна. Вы можете нажать клавишу F5 , чтобы продолжить работу с ним, и увидеть поведение обработки исключений, которое демонстрируется в приведенных ниже примерах. Чтобы предотвратить нарушение Visual Studio при первой ошибке, просто снимите флажок "Просто мой код" в разделе "Сервис", "Параметры", "Отладка", "Общие".
Пример
В следующем примере CancelAsync метод регистрируется в качестве метода, вызываемого при запросе отмены с помощью маркера отмены.
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
Если отмена уже была запрошена к моменту регистрации обратного вызова, вызов все равно гарантировано произойдет. В конкретном случае, если не выполняется асинхронная операция, метод не будет делать ничего, поэтому всегда безопасно вызывать метод.