أنماط CancellationToken والإلغاء التعاوني
مرّر CancellationToken واحترمه: أنشئ CTS، وافحص الإلغاء أو ارمِ استثناءه، ومرّره إلى واجهات API غير المتزامنة، ونظّف التسجيلات.
أنماط CancellationToken والإلغاء التعاوني درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 3 دروس في المجموع.
الإلغاء التعاوني
الهدف: إلغاء العمل بطريقة تعاونية.
- إنشاء CancellationTokenSource
- تمرير CancellationToken إلى الطبقات الأدنى
- التحقق من IsCancellationRequested أو استدعاء ThrowIfCancellationRequested()
- الاستجابة للإلغاء بسرعة وبطريقة سليمة
الإلغاء بتحكم المستدعي
أنشئ CancellationTokenSource، ومرّر الرمز، ثم ألغِ العملية من المستدعي؛ فتطرح الدالة المستدعاة OperationCanceledException.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
static async Task WorkAsync(CancellationToken ct)
{
// Poll occasionally; throw to end cooperatively
for (int i = 0; i < 5; i++)
{
ct.ThrowIfCancellationRequested();
Console.WriteLine("Step " + i);
await Task.Delay(100, ct); // pass token to async API
}
}
public static void Main(string[] args)
{
var cts = new CancellationTokenSource();
Task t = WorkAsync(cts.Token);
// Cancel after a short delay (simulated user action)
Thread.Sleep(180);
cts.Cancel();
try
{
t.GetAwaiter().GetResult();
}
catch (OperationCanceledException)
{
Console.WriteLine("Canceled!");
}
}
}
تمرير الرموز
مرّر الرمز عبر كل طبقة غير متزامنة حتى تتمكن الاستدعاءات الداخلية من التوقف بسرعة.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
static async Task<string> FetchAsync(CancellationToken ct)
{
await Task.Delay(80, ct); // pretend I/O
ct.ThrowIfCancellationRequested();
return "data";
}
static async Task<string> ProcessAsync(CancellationToken ct)
{
string raw = await FetchAsync(ct); // forward token
await Task.Delay(80, ct);
return raw.ToUpperInvariant();
}
public static void Main(string[] args)
{
var cts = new CancellationTokenSource();
Task<string> job = ProcessAsync(cts.Token);
cts.CancelAfter(100); // schedule a cancellation
try
{
Console.WriteLine(job.GetAwaiter().GetResult());
}
catch (OperationCanceledException)
{
Console.WriteLine("Pipeline canceled");
}
}
}
التنظيف باستخدام token.Register
استخدم token.Register لإرفاق إجراء تنظيف صغير يُنفَّذ عند طلب الإلغاء.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
static async Task UseRegistrationAsync(CancellationToken ct)
{
using (ct.Register(() => Console.WriteLine("Cleanup: releasing temp resources")))
{
for (int i = 0; i < 3; i++)
{
ct.ThrowIfCancellationRequested();
await Task.Delay(120, ct);
Console.WriteLine("Tick " + i);
}
}
}
public static void Main(string[] args)
{
var cts = new CancellationTokenSource();
Task t = UseRegistrationAsync(cts.Token);
Thread.Sleep(150);
cts.Cancel();
try { t.GetAwaiter().GetResult(); }
catch (OperationCanceledException) { Console.WriteLine("Canceled with cleanup"); }
}
}
المصادر المرتبطة
تدمج CreateLinkedTokenSource إشارات متعددة، مثل إلغاء المستخدم وانتهاء المهلة، في رمز واحد.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
static async Task WorkAsync(CancellationToken ct)
{
await Task.Delay(500, ct);
Console.WriteLine("Finished work");
}
public static void Main(string[] args)
{
var parent = new CancellationTokenSource();
var timeout = new CancellationTokenSource();
timeout.CancelAfter(200);
// Link both sources: cancel if parent OR timeout requests
var linked = CancellationTokenSource.CreateLinkedTokenSource(parent.Token, timeout.Token);
Task t = WorkAsync(linked.Token);
try { t.GetAwaiter().GetResult(); }
catch (OperationCanceledException) { Console.WriteLine("Canceled by parent/timeout"); }
finally { linked.Dispose(); parent.Dispose(); timeout.Dispose(); }
}
}
أفضل الممارسات
نصائح:
- مرّر الرموز إلى واجهات برمجة التطبيقات غير المتزامنة مثل Task.Delay وعمليات الإدخال والإخراج حتى تتوقف بسرعة.
- اطرح OperationCanceledException لإنهاء العمل؛ ولا تبتلع الاستثناء.
- تخلّص من CancellationTokenSource إذا كان يملك مؤقتات أو تسجيلات.
- حافظ على سرعة معالجات الأحداث؛ ونفّذ أقل قدر ممكن من العمل داخل Register.
قاعدة الإلغاء التعاوني
مراجعة
مراجعة: اجعل الإلغاء تعاونيًا—مرّر الرموز، أو افحصها دوريًا، أو استدعِ ThrowIfCancellationRequested، وأرفق عملية تنظيف صغيرة، واربط المصادر للحصول على إشارات مجمعة.
تعلم C# مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 93
- الدروس
- 346
الأسئلة الشائعة
هل درس «أنماط CancellationToken والإلغاء التعاوني» مجاني؟
نعم — نص درس «أنماط CancellationToken والإلغاء التعاوني» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 3 دروس في المجموع.
ماذا ستتعلم في «أنماط CancellationToken والإلغاء التعاوني»؟
مرّر CancellationToken واحترمه: أنشئ CTS، وافحص الإلغاء أو ارمِ استثناءه، ومرّره إلى واجهات API غير المتزامنة، ونظّف التسجيلات. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟
لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 3.
كم من الوقت يستغرق درس «أنماط CancellationToken والإلغاء التعاوني»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟
نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أنماط CancellationToken والإلغاء التعاوني
- المهل الزمنية وIProgress والتخلص غير المتزامن (محاكاة)
- أساسيات المرونة: إعادة المحاولة والتراجع التدريجي