C# Academy · درس

مشكلات عدم التزامن: التزامن فوق عدم التزامن والتعطّل المتبادل

حدّد مشكلات عدم التزامن مثل التزامن فوق عدم التزامن والتعطّل المتبادل. تعلّم سبب تجميد الاستدعاءات الحاجزة للتطبيقات وكيفية تجنب المشكلات الشائعة.

الدرس 2 من 38 خطوة

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

نظرة عامة على المشكلات المحتملة

المشكلات المحتملة: تجعل Async كتابة الشيفرة أسهل، لكن مزج المتزامن بغير المتزامن قد يجمّد التطبيقات أو يسبب حالات جمود.

المتزامن فوق غير المتزامن

يؤدي استدعاء .Result على Task إلى حظر مؤشر الترابط. قد ينجح ذلك في تطبيقات وحدة التحكم، لكنه يعرّض تطبيقات UI أو ASP.NET لخطر حالة الجمود.

using System;
using System.Threading.Tasks;

public class Program
{
  static async Task<string> SayHelloAsync()
  {
    await Task.Delay(200); // simulate async delay
    return "Hello";
  }

  public static void Main(string[] args)
  {
    // BAD: calling .Result blocks the thread
    string msg = SayHelloAsync().Result;
    Console.WriteLine(msg);
  }
}

إكمال أكثر أمانًا

في العروض التوضيحية لتطبيقات وحدة التحكم، يمكنك الحظر بحذر. أما في التطبيقات الفعلية، ففضّل استخدام async طوال سلسلة الاستدعاءات: علّم الطرق بأنها async واستخدم await، لا .Result.

using System;
using System.Threading.Tasks;

public class Program
{
  static async Task<string> SayHelloAsync()
  {
    await Task.Delay(200);
    return "Hello async";
  }

  public static void Main(string[] args)
  {
    // In C# 6, Main is sync; avoid blocking in real apps
    string msg = SayHelloAsync().GetAwaiter().GetResult(); // safer than .Result
    Console.WriteLine(msg);
  }
}

آلية حالة الجمود

سلسلة حالة الجمود:

  • يحظر مؤشر الترابط التنفيذ عند Task.Result
  • تحتاج المتابعة إلى مؤشر الترابط نفسه
  • لا تعمل المتابعة أبدًا
  • لا تصل النتيجة أبدًا — فتحدث حالة جمود

مشكلة Wait()

يُعد .Wait() استدعاءً آخر حاجبًا، وقد يسبب المشكلات نفسها التي يسببها .Result.

using System;
using System.Threading.Tasks;

public class Program
{
  static async Task<string> WorkAsync()
  {
    await Task.Delay(100);
    return "done";
  }

  public static void Main(string[] args)
  {
    // BAD: Wait() can also deadlock in UI/ASP.NET
    WorkAsync().Wait();
    Console.WriteLine("Completed");
  }
}

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

الإرشادات:

  • تجنب مزج المتزامن بغير المتزامن
  • استخدم async/await عبر مكدس الاستدعاءات بأكمله
  • لا تحظر إلا في تطبيقات وحدة التحكم التوضيحية
  • في تطبيقات UI أو الويب، لا تستدعِ مطلقًا .Result أو .Wait()

خطر الجمود بسبب Result

تحقق سريع: لماذا يُعد استدعاء .Result على Task غير متزامن خطيرًا في سياقات UI أو ASP.NET؟

مراجعة

مراجعة: قد يؤدي حظر مهام Async باستخدام .Result أو .Wait() إلى حالات جمود. فضّل استخدام async/await عبر سلسلة الاستدعاءات بأكملها.

البدء مجانًا

تعلم C# مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
93
الدروس
346

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

هل درس «مشكلات عدم التزامن: التزامن فوق عدم التزامن والتعطّل المتبادل» مجاني؟

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

ماذا ستتعلم في «مشكلات عدم التزامن: التزامن فوق عدم التزامن والتعطّل المتبادل»؟

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

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

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

كم من الوقت يستغرق درس «مشكلات عدم التزامن: التزامن فوق عدم التزامن والتعطّل المتبادل»؟

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

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

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

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

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