Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Узнайте, как зарегистрировать делегат, который будет вызываться, когда 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
Если отмена уже была запрошена к моменту регистрации обратного вызова, вызов все равно гарантировано произойдет. В конкретном случае, если не выполняется асинхронная операция, метод не будет делать ничего, поэтому всегда безопасно вызывать метод.