Görev iptali
ve System.Threading.Tasks.Task System.Threading.Tasks.Task<TResult> sınıfları, iptal belirteçleri aracılığıyla iptali destekler. Daha fazla bilgi için bkz. Yönetilen İş Parçacıklarında İptal. Görev sınıflarında iptal etme işlemi, iptal edilebilir bir işlemi temsil eden kullanıcı temsilcisi ile iptali talep eden kod arasında işbirliğini içerir. Başarılı bir iptal işlemi, yöntemini çağıran kodu CancellationTokenSource.Cancel ve kullanıcı temsilcisinin işlemi zamanında sonlandırmayı içerir. Aşağıdaki seçeneklerden birini kullanarak işlemi sonlandırabilirsiniz:
Yalnızca temsilciden döndürerek. Birçok senaryoda bu yeterlidir; ancak, bu şekilde iptal edilen bir görev örneği, TaskStatus.RanToCompletion durumuna değil, durumuna TaskStatus.Canceled geçiştir.
bir OperationCanceledException atarak ve iptalin istenen belirteci iletir. Bunu yapmak için yöntemi kullanmak tercih ThrowIfCancellationRequested edilir. Bu şekilde iptal edilen bir görev, çağıran kodun iptal isteğine yanıt olarak verilen görevi doğrulamak için kullanabileceği İptal Edildi durumuna geçer.
Aşağıdaki örnekte, özel durum oluşturan görev iptal işlemi için temel düzen gösterilmektedir. Belirtecin kullanıcı temsilcisine ve görev örneğine geçirildiğini unutmayın.
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
Daha eksiksiz bir örnek için, bkz. How to: Cancel a Task and Its Children.
Bir görev örneği kullanıcı kodu tarafından oluşturulan bir gözlemle, özel durumun belirteci ile ilişkili belirteci (Görevi oluşturan OperationCanceledException API'ye geçirilen belirteç) karşılaştırıldığında. Bunlar aynıysa ve belirtecin özelliği true döndürürse, görev bunu iptal bildirimi olarak yorumlar ve İptal edildi IsCancellationRequested durumuna geçişler. Görevi beklemek için bir Wait veya WaitAll yöntemi kullansanız, görev yalnızca durumunu olarak Canceled ayarlar.
İptal edildi durumuna geçilen bir Görev bekliyorsanız, bir özel System.Threading.Tasks.TaskCanceledException durum (özel durumla sarmalanmış) AggregateException oluşturur. Bu özel durumun, hatalı bir durum yerine başarılı bir iptal işlemini gösterdiğine dikkat edin. Bu nedenle, görevin özelliği Exception null döndürür.
Belirtecin özelliği false döndürürse veya özel durumun belirteci Görevin belirteciyle eşleşmezse, normal bir özel durum gibi kabul edilir ve Bu da Görevin Hatalı durumuna geçişe IsCancellationRequested OperationCanceledException neden olur. Ayrıca, başka özel durumların da Görevin Hatalı durumuna geçmesine neden olacağını unutmayın. Tamamlanan görevin durumunu özelliğinde Status eldeebilirsiniz.
İptal işlemi istendikten sonra görev bazı öğeleri işlemeye devam edebilir.