برنامهنویسی ناهمگام
برنامهنویسی ناهمگام در سیشارپ یک رویکرد کلیدی برای توسعه نرمافزارهای مدرن است که نیازمند انجام عملیات طولانی مدت مانند درخواستهای شبکه، دسترسی به پایگاه داده یا پردازش فایل بدون مسدود کردن جریان اصلی برنامه میباشد. این سبک برنامهنویسی به توسعهدهندگان اجازه میدهد تا برنامههای پاسخگو، مقیاسپذیر و کارآمد ایجاد کنند، که در برنامههای دسکتاپ، وب و معماریهای سرویسگرا اهمیت ویژهای دارد.
در سیشارپ، برنامهنویسی ناهمگام با استفاده از کلیدواژههای async و await، و انواع Task و Task
در این آموزش، خواننده با نحوه ساخت متدهای ناهمگام، الگوهای عملی، مدیریت خطاها و کاربرد مفاهیم پیشرفته سیشارپ در پروژههای واقعی آشنا خواهد شد. در پایان، توسعهدهندگان قادر خواهند بود برنامههایی بسازند که عملیات همزمان را بهطور کارآمد، امن و مطابق با استانداردهای توسعه سیشارپ انجام دهند، و این مهارتها به بهبود معماری نرمافزار و افزایش کارایی سیستمها کمک میکند.
مثال پایه
textusing System;
using System.Threading.Tasks;
namespace AsyncDemo
{
class Program
{
static async Task Main(string\[] args)
{
Console.WriteLine("شروع عملیات ناهمگام...");
string result = await FetchDataAsync();
Console.WriteLine($"دادهها دریافت شد: {result}");
Console.WriteLine("عملیات تکمیل شد.");
}
static async Task<string> FetchDataAsync()
{
await Task.Delay(2000); // شبیهسازی عملیات طولانی
return "سلام از دنیای ناهمگام!";
}
}
}
در این مثال، متد FetchDataAsync با کلیدواژه async مشخص شده و نوع بازگشتی Task
این الگو تضمین میکند که برنامه در حین انجام عملیات طولانی، پاسخگو باقی بماند. استفاده از PascalCase برای متدها و camelCase برای متغیرها، رعایت استانداردهای نامگذاری و مدیریت استثناها از بهترین شیوههای سیشارپ محسوب میشوند. همچنین، استفاده از Task.Result یا Task.Wait باید اجتناب شود تا از Deadlock جلوگیری گردد.
مثال کاربردی
textusing System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
namespace AsyncDemo
{
class Program
{
static async Task Main(string\[] args)
{
List<string> urls = new List<string>
{
"[https://jsonplaceholder.typicode.com/posts/1](https://jsonplaceholder.typicode.com/posts/1)",
"[https://jsonplaceholder.typicode.com/posts/2](https://jsonplaceholder.typicode.com/posts/2)",
"[https://jsonplaceholder.typicode.com/posts/3](https://jsonplaceholder.typicode.com/posts/3)"
};
try
{
List<Task<string>> tasks = new List<Task<string>>();
foreach (var url in urls)
{
tasks.Add(GetUrlAsync(url));
}
string[] results = await Task.WhenAll(tasks);
foreach (var content in results)
{
Console.WriteLine(content.Substring(0, Math.Min(50, content.Length)) + "...");
}
}
catch (HttpRequestException ex)
{
Console.WriteLine($"خطا در درخواست: {ex.Message}");
}
}
static async Task<string> GetUrlAsync(string url)
{
using HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
}
این مثال، اجرای همزمان چندین درخواست HTTP را با Task.WhenAll نشان میدهد. هر URL در یک Task جداگانه پردازش میشود که باعث افزایش کارایی میشود. استفاده از using برای HttpClient، مدیریت صحیح منابع و جلوگیری از نشتی حافظه را تضمین میکند.
همچنین، try-catch برای مدیریت خطاها استفاده شده و متد GetUrlAsync اصول async/await را به درستی پیادهسازی میکند. این الگو در برنامههای وب، APIها و سرویسهای Backend بسیار کاربرد دارد و نشان میدهد چگونه شیگرایی، الگوریتمهای بهینه و مدیریت منابع در برنامهنویسی ناهمگام ترکیب میشوند.
بهترین شیوهها در سیشارپ برای برنامهنویسی ناهمگام شامل استفاده صحیح از async/await، اجتناب از async void به جز برای رویدادها، مدیریت چرخه عمر Tasks، و استفاده از Task.WhenAll/WhenAny برای اجرای همزمان چندین Task است. استفاده از Task.Result یا Task.Wait میتواند باعث Deadlock شود و باید از آن اجتناب گردد.
برای بهینهسازی عملکرد، ایجاد Threads غیرضروری کاهش یابد، HttpClient بازاستفاده شود و از Wrapping غیرضروری Task اجتناب شود. برای دیباگینگ، بررسی Stack Trace تسکها، لاگگیری و پایش Threads توصیه میشود. همچنین، اعتبارسنجی دادهها و مدیریت صحیح استثناها، از لحاظ امنیتی بسیار مهم هستند.
📊 جدول مرجع
سیشارپ Element/Concept | Description | Usage Example |
---|---|---|
async | تعریف متد ناهمگام | async Task<string> FetchDataAsync() |
await | انتظار برای تکمیل Task بدون مسدود کردن Thread | string data = await FetchDataAsync(); |
Task & Task<T> | نمایانگر عملیات ناهمگام | Task<string> task = FetchDataAsync(); |
Task.WhenAll/WhenAny | اجرای چند Task به صورت همزمان | await Task.WhenAll(task1, task2); |
HttpClient ناهمگام | ارسال درخواست HTTP به صورت ناهمگام | using HttpClient client = new HttpClient(); |
برنامهنویسی ناهمگام در سیشارپ برای ایجاد برنامههای پاسخگو و مقیاسپذیر ضروری است. تسلط بر async/await، Task و Task
🧠 دانش خود را بیازمایید
Test Your Knowledge
Test your understanding of this topic with practical questions.
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود