البرمجة غير المتزامنة في C#: دليل شامل للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة
```html

مقدمة في البرمجة غير المتزامنة في C#



البرمجة غير المتزامنة هي أحد المفاهيم الأساسية في التطوير الحديث باستخدام C#. فهي تسمح لتطبيقك بعدم حظر سير التنفيذ الرئيسي أثناء انتظار العمليات الطويلة، مثل قراءة الملفات، أو الاستعلامات من قاعدة البيانات، أو استدعاءات HTTP. بدلاً من انتظار اكتمال العملية، يمكن للبرنامج متابعة تنفيذ مهام أخرى، مما يجعل التطبيقات أكثر استجابة وكفاءة.



في هذا الدليل، سنشرح أساسيات البرمجة غير المتزامنة في C# للمبتدئين. ستتعرف على معنى الكلمات المفتاحية async و await، وكيفية العمل مع الكلاس Task، وسترى أمثلة عملية على الكود. حتى لو كنت في بداية مشوارك مع .NET، ستساعدك هذه المادة على استخدام البرمجة غير المتزامنة بثقة في مشاريعك.



لماذا البرمجة غير المتزامنة مهمة جداً؟ تخيل أن تطبيقك يحتاج إلى تحميل بيانات من خادم. في الوضع المتزامن (Synchronous)، ستتجمد واجهة المستخدم حتى اكتمال التحميل. النهج غير المتزامن يحل هذه المشكلة: تبقى الواجهة نشطة، ويتم تحميل البيانات في الخلفية.



المفاهيم الأساسية: async و await و Task



ما هو Task؟



في C#، يتم تمثيل العمليات غير المتزامنة بواسطة الكلاس Task (أو Task<TResult> لإرجاع قيمة). Task هو وعد بتنفيذ عمل ما في المستقبل. فهو يغلف حالة العملية غير المتزامنة ويسمح بتتبع اكتمالها.



مثال بسيط لإنشاء مهمة (Task):



using System;using System.Threading.Tasks;

class Program{ static void Main() { // إنشاء مهمة يتم تنفيذها بشكل متزامن Task task = Task.Run(() => { Console.WriteLine("المهمة تُنفذ في الخلفية"); });

task.Wait(); // انتظار اكتمال المهمة }}


الكلمتان المفتاحيتان async و await



الكلمة المفتاحية async تخبر المترجم (Compiler) أن الميثود يحتوي على كود غير متزامن. الكلمة المفتاحية await توقف تنفيذ الميثود مؤقتاً حتى اكتمال المهمة المنتظرة، دون حظر التيار (Thread).



قاعدة مهمة: الميثود الذي يحمل علامة async يجب أن يعيد Task، أو Task<T>، أو void (لمعالجات الأحداث).



مثال أساسي:



using System;using System.Threading.Tasks;

class Program{ static async Task Main(string[] args) { Console.WriteLine("بداية العمل"); // استدعاء غير متزامن await PerformLongOperationAsync(); Console.WriteLine("تم اكتمال العمل"); }

static async Task PerformLongOperationAsync() { Console.WriteLine("بدء العملية الطويلة..."); // محاكاة تأخير (مثل طلب HTTP) await Task.Delay(2000); Console.WriteLine("تم اكتمال العملية"); }}


لاحظ: عند استخدام await Task.Delay(2000)، لا يتم حظر التيار لمدة ثانيتين. بدلاً من ذلك، يتم إعادة التحكم إلى الكود المستدعي، وبعد ثانيتين يستمر التنفيذ من هذه النقطة.



أمثلة عملية على العمليات غير المتزامنة



قراءة ملف بشكل غير متزامن



أحد السيناريوهات الأكثر شيوعاً هو العمل مع الملفات. في .NET هناك ميثودات غير متزامنة مدمجة للإدخال والإخراج:



using System;using System.IO;using System.Threading.Tasks;

class FileExample{ public static async Task ReadFileAsync(string filePath) { using (StreamReader reader = new StreamReader(filePath)) { string content = await reader.ReadToEndAsync(); Console.WriteLine(content); } }

static async Task Main() { string path = "example.txt"; // إنشاء ملف اختباري await File.WriteAllTextAs ```

المدونات

توصيات الكتب