مقدمة في البرمجة غير المتزامنة في C#
البرمجة غير المتزامنة هي أحد المفاهيم الأساسية في التطوير الحديث باستخدام C#. في عصر تطبيقات الويب عالية التحميل، والخدمات المصغرة، والحلول السحابية، أصبحت القدرة على العمل بكفاءة مع عدم التزامن مهارة إلزامية لكل مطور .NET.
الهدف الرئيسي للبرمجة غير المتزامنة هو عدم حظر تدفق التنفيذ أثناء انتظار العمليات الطويلة (الإدخال/الإخراج، العمل مع الشبكة، استعلامات قاعدة البيانات). بدلاً من ذلك، يتم تحرير التدفق لمعالجة مهام أخرى، مما يزيد بشكل كبير من أداء التطبيق وقابليته للتوسع.
في هذه المقالة، سنشرح:
- أساسيات async/await في C#
- العمل مع كلاس Task
- قواعد كتابة الطرق غير المتزامنة
- الأخطاء النموذجية وطرق تجنبها
أساسيات async/await في C#
النموذج الأساسي للبرمجة غير المتزامنة في C# يعتمد على كلمتين رئيسيتين: async و await. تم تقديمهما في C# 5.0 ومنذ ذلك الحين أصبحا المعيار للعمل مع عدم التزامن.
كيف يعمل async/await
الكلمة المفتاحية async تُستخدم لتعريف طريقة غير متزامنة. await تُطبق على مهمة (Task) لإيقاف تنفيذ الطريقة مؤقتًا حتى اكتمالها، دون حظر التدفق الحالي.
public async Task<string> GetDataAsync(){ // محاكاة طلب HTTP غير متزامن using var client = new HttpClient(); string result = await client.GetStringAsync("https://api.example.com/data"); return result;}
public async Task ProcessAsync(){ string data = await GetDataAsync(); Console.WriteLine($"تم استلام البيانات: {data}");}من المهم أن نفهم: await لا يحجب التدفق. إنه ينقل التحكم إلى الكود المستدعي، وعندما تكتمل المهمة، تستمر الطريقة في التنفيذ من نفس النقطة.
أنواع القيم المُرجعة للطرق غير المتزامنة
يمكن للطريقة غير المتزامنة أن تُرجع واحدًا من ثلاثة أنواع:
Task— للطرق التي لا تُرجع قيمةTask<T>— للطرق التي تُرجع قيمة من النوع TValueTask<T>— للسيناريوهات عالية الأداء، عندما تكون النتيجة متاحة بشكل متزامن في كثير من الأحيان
// بدون قيمة مرجعةpublic async Task SaveDataAsync(string data){ await File.WriteAllTextAsync("data.txt", data);}
// مع قيمة مرجعةpublic async Task<int> CalculateSumAsync(int a, int b){ await Task.Delay(100); // محاكاة عملية طويلة return a + b;}
// ValueTask للتحسينpublic async ValueTask<bool> CheckCacheAsync(string key){ if (_cache.ContainsKey(key)) return true; await Task.Delay(50); return false;}العمل المتقدم مع Task
كلاس Task هو أساس البرمجة غير المتزامنة في C#. دعنا نستعرض أكثر الطرق والأنماط فائدة.
التنفيذ المتوازي للمهام
الطرق Task.WhenAll و Task.WhenAny تسمح بإدارة عدة عمليات غير متزامنة بكفاءة.
public async Task ProcessMultipleRequestsAsync(){ var task1 = FetchDataAsync("url1"); var task2 = FetchDataAsync("url2"); var task3 = FetchDataAsync("url3"); // انتظار اكتمال جميع المهام await Task.WhenAll(task1, task2, task3); Console.WriteLine("جميع الطلبات مكتملة");}
public async Task<string> GetFirstResponseAsync(){ var task1 = FetchDataAsync("url1"); var task2 = FetchDataAsync("url2"); // انتظار أول مهمة تكتمل Task<string> completedTask = await Task.WhenAny(task1, task2); return await completedTask;}