إلغاء مهمة
System.Threading.Tasks.Taskو System.Threading.Tasks.Task<TResult>فئات دعم إلغاء من خلال استخدام الرموز المميزة للإلغاء، وهي عبارة عن الجديد في .NET Framework 4. لمزيد من المعلومات، راجع Cancellation. في فئات مهمة، يتضمن إلغاء التعاون بين مستخدم تفويض، الذي يمثل عملية cancelable والتعليمة البرمجية لطلب الإلغاء. تتضمن رسالة نجاح بإلغاء طلب التعليمة البرمجية استدعاء CancellationTokenSource.Cancelالأسلوب، ومستخدم تفويض إنهاء تشغيل بطريقة الوقت المناسب. يمكنك ينهي تشغيل بواسطة استخدام واحد الخيارات التالية:
بمجرد الخروج من المفوض. في العديد من السيناريوهات th هو هو كافية؛ ومع ذلك، الولاية مهمة فيها هو "الغاء" في ترتيب هو طريقة انتقال إلى الولاية RanToCompletion، وليس إلى الولاية تم الإلغاء.
بواسطة طرح OperationCanceledExceptionو تمرير الرمز المميز الذي تم طلب الإلغاء. الطريقة المفضلة للقيام بترتيب هو هو لاستخدام ThrowIfCancellationRequestedالأسلوب. أ المهام التي هو إلغاء في ترتيب هو طريقة انتقال إلى الولاية تم الإلغاء، والتي يمكن استخدامها استدعاء تعليمات برمجية للتحقق من أن المهمة استجابة لطلب الإلغاء الخاص به.
يوضح المثال التالي أساسى نقش لإلغاء مهمة يطرح استثناء. لاحظ أن الرمز المميز هو التي تم تمريرها إلى المفوض المستخدم وإلى مثيل مهمة نفسها.
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.
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("msg: " + e.Message)
Next
End Try
var tokenSource2 = new CancellationTokenSource();
CancellationToken ct = tokenSource2.Token;
var task = Task.Factory.StartNew(() =>
{
// 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 StartNew.
tokenSource2.Cancel();
// Just continue on this thread, or Wait/WaitAll with try-catch:
try
{
task.Wait();
}
catch (AggregateException e)
{
foreach (var v in e.InnerExceptions)
Console.WriteLine("msg: " + v.Message);
}
لمثال كامل أكثر ، راجع كيفية القيام بما يلي: إلغاء الأمر مهمة و الخاص الأطفال.
عندما observes مثيل مهمة OperationCanceledExceptionتم طرح برمز مستخدم، فإنه يقارن الرمز المميز للاستثناء إلى الرمز المميز المقترن به (تلك التي تم تمريرها إلى واجهة برمجة تطبيقات تاريخ الإنشاء المهمة). إذا كانت من نفس خاصية IsCancelledRequested للرمز المميز إرجاع صحيحاً، مهمة يفسر هذا كالاقرار الإلغاء الانتقالات إلى الحالة التي تم الإلغاء. إذا كنت لا تستخدم Waitأو WaitAllأسلوب لانتظار مهمة، ثم تعيين مهمة فقط بحالته إلى تم الإلغاء.
إذا كنت تنتظر على مهمة الانتقالات إلى الالولاية التي تم الإلغاء، TaskCanceledException(wrapped في anAggregateException) هو مصنع وطرح. ملاحظة أن يشير هذا استثناء إلى إلغاء الناجحة بدلاً من موقف خاطئ. لذلك، خاصية الاستثناء الخاص بمهمة إرجاع خالية.
إذا كان الرمز الذي IsCancellationRequestedخاصية بإرجاع خطأ أو إذا لا يطابق الرمز المميز للاستثناء الخاص مهمة الرمز المميز، OperationCanceledExceptionهو معاملتها كاستثناء عادي، يسبب مهمة للانتقال إلى الولاية خاطئ. لاحظ أيضا أن وجود استثناءات غير ذلك كما سيؤدي إلى حدوث مهمة للانتقال إلى الولاية خاطئ. يمكنك يحصل حالة اكتملت مهمة في Statusخاصية.
هو المحتملة التي قد يستمر مهمة لمعالجة بعض عناصر بعد إلغاء هو المطلوبة.
راجع أيضًا:
المهام
كيفية القيام بما يلي: إلغاء الأمر مهمة و الخاص الأطفال