Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Klasy System.Threading.Tasks.Task i System.Threading.Tasks.Task<TResult> obsługują anulowanie przy użyciu tokenów anulowania. Aby uzyskać więcej informacji, zobacz Anulowanie w zarządzanych wątkach. W klasach Task anulowanie obejmuje współpracę między pełnomocnikiem użytkownika, który reprezentuje operację, którą można anulować, oraz kod, który zażądał anulowania. Pomyślne anulowanie obejmuje wywołanie przez kod żądający metody CancellationTokenSource.Cancel, a delegat użytkownika kończy operację w odpowiednim czasie. Możesz zakończyć operację przy użyciu jednej z następujących opcji:
Wracając z delegacji. W wielu scenariuszach ta opcja jest wystarczająca. Jednak instancja zadania, która została anulowana w ten sposób, przechodzi do stanu TaskStatus.RanToCompletion, a nie do stanu TaskStatus.Canceled.
Poprzez wywołanie wyjątku OperationCanceledException i przekazanie tokenu, dla którego zażądano anulowania. Preferowanym sposobem wykonania jest użycie ThrowIfCancellationRequested metody . Zadanie, które zostało anulowane w ten sposób, przechodzi do stanu Anulowano, którego kod wywołujący może użyć do sprawdzenia, czy zadanie odpowiedziało na żądanie anulowania.
W poniższym przykładzie przedstawiono podstawowy wzorzec anulowania zadania, który zgłasza wyjątek:
Uwaga / Notatka
Token jest przekazywany do delegata użytkownika i instancji zadania.
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var tokenSource2 = new CancellationTokenSource();
CancellationToken ct = tokenSource2.Token;
var task = Task.Run(() =>
{
// Were we already canceled?
ct.ThrowIfCancellationRequested();
bool moreToDo = true;
while (moreToDo)
{
// Poll on this property if you have to do
// other cleanup before throwing.
if (ct.IsCancellationRequested)
{
// Clean up here, then...
ct.ThrowIfCancellationRequested();
}
}
}, tokenSource2.Token); // Pass same token to Task.Run.
tokenSource2.Cancel();
// Just continue on this thread, or await with try-catch:
try
{
await task;
}
catch (OperationCanceledException e)
{
Console.WriteLine($"{nameof(OperationCanceledException)} thrown with message: {e.Message}");
}
finally
{
tokenSource2.Dispose();
}
Console.ReadKey();
}
}
Imports System.Threading
Imports System.Threading.Tasks
Module Test
Sub Main()
Dim tokenSource2 As New CancellationTokenSource()
Dim ct As CancellationToken = tokenSource2.Token
Dim t2 = Task.Factory.StartNew(Sub()
' Were we already canceled?
ct.ThrowIfCancellationRequested()
Dim moreToDo As Boolean = True
While moreToDo = True
' Poll on this property if you have to do
' other cleanup before throwing.
If ct.IsCancellationRequested Then
' Clean up here, then...
ct.ThrowIfCancellationRequested()
End If
End While
End Sub _
, tokenSource2.Token) ' Pass same token to StartNew.
' Cancel the task.
tokenSource2.Cancel()
' Just continue on this thread, or Wait/WaitAll with try-catch:
Try
t2.Wait()
Catch e As AggregateException
For Each item In e.InnerExceptions
Console.WriteLine(e.Message & " " & item.Message)
Next
Finally
tokenSource2.Dispose()
End Try
Console.ReadKey()
End Sub
End Module
Aby uzyskać pełny przykład, zobacz Jak anulować zadanie i jego elementy podrzędne.
Gdy instancja zadania obserwuje wyjątek OperationCanceledException wyrzucony przez kod użytkownika, porównuje token wyjątku z jego skojarzonym tokenem (tym, który został przekazany do interfejsu API, który utworzył zadanie). Jeśli tokeny są takie same, a właściwość tokenu IsCancellationRequested zwraca wartość true
, zadanie interpretuje to jako potwierdzenie anulowania i przejście do stanu Anulowane. Jeśli nie używasz metody Wait lub WaitAll do oczekiwania na zadanie, to zadanie po prostu ustawia swój stan na Canceled.
Jeśli czekasz na zadanie, które przechodzi do stanu anulowania, zgłaszany jest wyjątek System.Threading.Tasks.TaskCanceledException (opakowany w wyjątek AggregateException). Ten wyjątek wskazuje pomyślne anulowanie zamiast nieprawidłowej sytuacji. W związku z tym właściwość zadania Exception zwraca wartość null
.
Jeśli właściwość tokenu IsCancellationRequested zwraca false
wartość lub token wyjątku nie jest zgodny z tokenem zadania, OperationCanceledException element jest traktowany jak normalny wyjątek, powodując przejście zadania do stanu Błąd. Obecność innych wyjątków spowoduje również, że zadanie przejdzie w stan awarii. Status ukończonego zadania można znaleźć we właściwości Status.
Istnieje możliwość, że zadanie może nadal przetwarzać niektóre elementy po żądaniu anulowania.