این مقاله به بررسی مفهوم برنامه نویسی غیر همزمان در C#.NET می پردازد، مزایای آن را بررسی می کند، مکانیسم های زیربنایی را تشریح می کند و بهترین شیوه ها را برای استفاده موثر ارائه می دهد.
برای درک اهمیت برنامه نویسی غیر همزمان، ضروری است که بین اجرای همزمان و غیر همزمان تمایز قائل شویم.

مزایای برنامه نویسی غیر همزمان
برنامه نویسی غیر همزمان در C#.NET مزایای بی شماری را ارائه می دهد، از جمله:
Async و Await: هسته برنامه نویسی غیر همزمان
C#.NET مدل برنامه نویسی غیر همزمان مبتنی بر وظیفه (TAP) را از طریق کلمات کلیدی async و await ارائه می دهد. این کلمات کلیدی انتزاعی را بر روی مکانیسم های پیچیده مدیریت رشته ارائه می دهند و نوشتن کد غیر همزمان را آسان تر و خواناتر می کنند.

مکانیسم های زیربنایی
در زیر کاپوت، کلمات کلیدی async و await با همکاری چارچوب Task Parallel Library (TPL) برای مدیریت عملیات غیر همزمان کار می کنند. هنگامی که یک متد async با یک عبارت await مواجه می شود، کامپایلر یک ماشین حالت ایجاد می کند که اجرای متد را به حالت تعلیق در می آورد و عملیات غیر همزمان را آغاز می کند.
عملیات غیر همزمان معمولاً روی یک رشته از استخر رشته یا از طریق مکانیزم تکمیل I/O اجرا می شود. هنگامی که عملیات کامل شد، ماشین حالت از سر گرفته می شود و اجرای متد async ادامه می یابد. این فرآیند تضمین می کند که رشته اصلی برنامه آزاد می ماند تا به سایر وظایف رسیدگی کند.
بهترین شیوه ها برای برنامه نویسی غیر همزمان
برای استفاده موثر از برنامه نویسی غیر همزمان در C#.NET، رعایت بهترین شیوه های زیر ضروری است:
از Async Void اجتناب کنید: متدهای async void برای کنترل کننده های رویداد طراحی شده اند، اما فاقد مکانیزم مناسب برای رسیدگی به خطا هستند. برای همه متدهای غیر همزمان دیگر، از async Task یا async Task به جای آن استفاده کنید.
سناریوهای دنیای واقعی
برنامه نویسی غیر همزمان در C#.NET در طیف گسترده ای از سناریوهای دنیای واقعی کاربرد دارد، از جمله:
مثال های کاربردی از برنامه نویسی غیر همزمان در C#.NET
در اینجا چند مثال عملی از برنامه نویسی غیر همزمان در C#.NET برای نشان دادن کاربرد آن در سناریوهای مختلف آورده شده است:
1. دانلود داده از یک API وب
public async Task DownloadDataAsync(string url)
{
using (HttpClient client = new HttpClient())
{
// ارسال یک درخواست GET غیر همزمان به URL مشخص شده
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode(); // پرتاب خطا برای کدهای وضعیت ناموفق
// خواندن محتوای پاسخ به عنوان یک رشته به صورت غیر همزمان
string result = await response.Content.ReadAsStringAsync();
return result;
}
}
// فراخوانی متد غیر همزمان
string data = await DownloadDataAsync("https://api.example.com/data");
Console.WriteLine(data);
در این مثال، متد DownloadDataAsync داده ها را از یک API وب به صورت غیر همزمان دانلود می کند. HttpClient.GetAsync و HttpContent.ReadAsStringAsync هر دو متدهای غیر همزمان هستند که با کلمه کلیدی await منتظر می مانند. این به برنامه اجازه می دهد تا در حین دانلود داده ها به عملیات دیگر ادامه دهد.
2. خواندن یک فایل بزرگ
public async Task ReadFileAsync(string filePath)
{
using (StreamReader reader = new StreamReader(filePath))
{
// خواندن محتوای فایل به صورت غیر همزمان
string content = await reader.ReadToEndAsync();
return content;
}
// فراخوانی متد غیر همزمان
string fileContent = await ReadFileAsync("largefile.txt");
Console.WriteLine(fileContent);}
این مثال محتوای یک فایل بزرگ را به صورت غیر همزمان با استفاده از StreamReader.ReadToEndAsync می خواند. این از مسدود شدن رشته اصلی برنامه در هنگام خواندن فایل جلوگیری می کند و پاسخگویی برنامه را حفظ می کند.
3. انجام محاسبات فشرده CPU
public async Task CalculateSumAsync(int n)
{
// انجام محاسبات فشرده CPU در یک رشته پس زمینه
int result = await Task.Run(() =>
{
int sum = 0;
for (int i = 1; i <= n; i++)
{
sum += i;
}
return sum;
});
return result;
}
// فراخوانی متد غیر همزمان
int sum = await CalculateSumAsync(1000000);
Console.WriteLine($"Sum: {sum}");
در این مثال، متد CalculateSumAsync مجموع اعداد از 1 تا n را با استفاده از Task.Run در یک رشته پس زمینه محاسبه می کند. این از مسدود شدن رشته اصلی برنامه در هنگام انجام محاسبات جلوگیری می کند.
4. به روز رسانی رابط کاربری
public async Task UpdateUIAsync()
{
// به روز رسانی یک عنصر رابط کاربری به صورت غیر همزمان
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
MyProgressBar.Value = 50; // به روز رسانی نوار پیشرفت
MyTextBlock.Text = "Processing..."; // به روز رسانی متن
});
// انجام عملیات طولانی مدت
await Task.Delay(2000); // شبیه سازی یک عملیات طولانی مدت
// به روز رسانی مجدد رابط کاربری
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
MyProgressBar.Value = 100; // به روز رسانی نوار پیشرفت
MyTextBlock.Text = "Completed!"; // به روز رسانی متن
});
}
// فراخوانی متد غیر همزمان
await UpdateUIAsync();
این مثال نحوه به روز رسانی عناصر رابط کاربری را به صورت غیر همزمان در یک برنامه UWP نشان می دهد. Dispatcher.RunAsync برای اجرای کد در رشته UI استفاده می شود. این تضمین می کند که به روز رسانی های رابط کاربری به صورت روان انجام می شوند و برنامه پاسخگو می ماند.
اینها تنها چند نمونه از چگونگی استفاده از برنامه نویسی غیر همزمان در C#.NET هستند. با استفاده از async و await، می توانید برنامه های پاسخگوتر، کارآمدتر و مقیاس پذیرتری ایجاد کنید.

نتیجه گیری
برنامه نویسی غیر همزمان یک تکنیک قدرتمند است که به توسعه دهندگان C#.NET امکان می دهد برنامه های پاسخگوتر، کارآمدتر و مقیاس پذیرتر ایجاد کنند. با درک اصول، استفاده موثر از کلمات کلیدی async و await و پیروی از بهترین شیوه ها، توسعه دهندگان می توانند از مزایای کامل برنامه نویسی غیر همزمان استفاده کرده و تجربه کاربری استثنایی را ارائه دهند.
0 نظر
هنوز نظری برای این مقاله ثبت نشده است.