0Pricing
C# Academy · درس

ConfigureAwait وتدفّق الاستثناءات

افهم التقاط السياق وConfigureAwait(false)؛ وعالج الاستثناءات مع await مقابل الحجب؛ وشاهد AggregateException وأفضل الممارسات.

ConfigureAwait وتدفّق الاستثناءات درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 3 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 3 دروس في المجموع.

السياق والاستثناءات

الأهداف:

  • معرفة ماهية التقاط السياق
  • معرفة متى يُستخدم ConfigureAwait(false)
  • فهم كيفية انتقال الاستثناءات مع await
  • فهم سبب أن الحظر يؤدي إلى AggregateException

أفضل ممارسة للمكتبات

ينبغي لطرق المكتبات استخدام ConfigureAwait(false) لتجنب الاستئناف في سياق UI أو الويب الذي لا تملكه.

using System;
using System.Threading.Tasks;

public static class NetLib
{
  // Library code should not assume a UI context. Use ConfigureAwait(false).
  public static async Task<string> FetchAsync()
  {
    await Task.Delay(100).ConfigureAwait(false); // do not capture context
    return "payload";
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    // Console apps typically have no SynchronizationContext; this still runs fine.
    string s = NetLib.FetchAsync().GetAwaiter().GetResult();
    Console.WriteLine("Got: " + s);
  }
}

قواعد السياق

التقاط السياق:

  • يحاول await الافتراضي الاستئناف في السياق المُلتقط، مثل UI أو ASP.NET
  • يقول ConfigureAwait(false): لا تلتقط السياق؛ استأنف التنفيذ على مجموعة مؤشرات الترابط
  • يساعد ذلك على تجنب حالات الجمود عندما يحظر المستدعون مؤشر ترابط السياق
  • قد تحتاج شيفرة UI إلى السياق لتحديث عناصر التحكم، أما شيفرة المكتبة فعادةً فلا تحتاج إليه

Await والاستثناءات

عند استخدام await، ينتقل الاستثناء بنوعه الأصلي؛ لذا يمكنك اعتراضه بالطريقة المعتادة.

using System;
using System.Threading.Tasks;

public class Program
{
  static async Task<string> BoomAsync()
  {
    await Task.Delay(50);
    throw new InvalidOperationException("boom");
  }

  public static void Main(string[] args)
  {
    // With await (inside async), exceptions rethrow as the original type.
    try
    {
      string r = BoomAsync().GetAwaiter().GetResult(); // emulate await in Main
      Console.WriteLine(r);
    }
    catch (InvalidOperationException ex)
    {
      Console.WriteLine("Caught: " + ex.GetType().Name + " - " + ex.Message);
    }
  }
}

الحظر والأخطاء

يؤدي الحظر باستخدام .Result أو .Wait() إلى تغليف الأخطاء داخل AggregateException؛ لذا فضّل await للحصول على تدفق أوضح للأخطاء.

using System;
using System.Threading.Tasks;

public class Program
{
  static async Task<int> FailsAsync()
  {
    await Task.Delay(30);
    throw new ArgumentException("bad arg");
  }

  public static void Main(string[] args)
  {
    try
    {
      // Blocking with .Result wraps the exception into AggregateException
      int x = FailsAsync().Result;
      Console.WriteLine(x);
    }
    catch (AggregateException ae)
    {
      Exception inner = ae.InnerException;
      Console.WriteLine("AggregateException -> " + (inner == null ? "null" : inner.GetType().Name));
    }
  }
}

أفضل الممارسات

الإرشادات:

  • في المكتبات: استخدم ConfigureAwait(false)
  • في تطبيقات UI أو الويب: استخدم await على مؤشر ترابط الاستدعاء عند الحاجة إلى السياق
  • تجنب .Result/.Wait()؛ واعترض الاستثناءات الأصلية باستخدام await
  • سجّل الاستثناء وأعد طرحه برسائل تراعي السياق عند الحاجة

سلوك ConfigureAwait

تحقق سريع: ماذا يخبر ConfigureAwait(false) عملية await أن تفعل؟

مراجعة

مراجعة: استخدم ConfigureAwait(false) في المكتبات، ودع شيفرة UI أو الويب تقرر متى تحتاج إلى السياق. فضّل await للحصول على تدفق واضح للاستثناءات؛ فالحظر يغلّف الأخطاء ويعرّض التطبيق لحالات الجمود.

الأسئلة الشائعة

هل درس «ConfigureAwait وتدفّق الاستثناءات» مجاني؟

نعم — نص درس «ConfigureAwait وتدفّق الاستثناءات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 3 دروس في المجموع.

ماذا ستتعلم في «ConfigureAwait وتدفّق الاستثناءات»؟

افهم التقاط السياق وConfigureAwait(false)؛ وعالج الاستثناءات مع await مقابل الحجب؛ وشاهد AggregateException وأفضل الممارسات. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 3.

كم من الوقت يستغرق درس «ConfigureAwait وتدفّق الاستثناءات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. Task/ValueTask وآلة الحالة غير المتزامنة (مفاهيم)
  2. مشكلات عدم التزامن: التزامن فوق عدم التزامن والتعطّل المتبادل
  3. ConfigureAwait وتدفّق الاستثناءات
← العودة إلى C# Academy