آموزش

بررسی async و await در asp.net

تصویر نویسنده مقاله پویان نبوی پویان نبوی
1405/01/02
مقایسه کدهای Synchronous و Asynchronous در دات‌نت

تفاوت بین کدهای Task و غیر Task در ASP.NET Core

در دنیای برنامه‌نویسی، مخصوصاً وقتی با دات‌نت کار می‌کنیم، خیلی وقت‌ها نیاز داریم کارهایی را به صورت هم‌زمان انجام دهیم تا سرعت و کارایی برنامه بالا برود. در اینجا دو نوع کد داریم که برای انجام کارها استفاده می‌شوند:

  • کدهای هم‌زمان (Synchronous)
  • کدهای غیرهم‌زمان (Asynchronous) یا همان Taskها

حالا بیایید بررسی کنیم این دو چه تفاوتی دارند و کدام‌یک را هنگام نوشتن برنامه باید انتخاب کنیم.


کد هم‌زمان (بدون استفاده از Task)

وقتی برنامه‌نویسی را شروع می‌کنید ممکن است با کدهای هم‌زمان روبه‌رو شوید. این نوع کد به صورت خطی اجرا می‌شود؛ یعنی عملیات‌ها یکی پس از دیگری انجام می‌شوند. برای مثال اگر از پایگاه‌داده اطلاعات بخواهید، برنامه باید تا زمانی که پاسخ دریافت شود منتظر بماند و بعد از آن به مرحله بعدی برود.

مزایا

  • این نوع کد ساده است و فهم آن راحت‌تر است.
  • برای برنامه‌هایی که عملیات طولانی ندارند یا به منابع خارجی متصل نمی‌شوند مناسب است.

معایب

  • اگر عملیاتی زمان‌بر باشد (مثلاً درخواست اینترنتی یا اتصال به پایگاه‌داده)، برنامه برای مدت طولانی متوقف می‌شود و کاربر باید منتظر بماند.

کد غیرهم‌زمان (با استفاده از Task و Async)

در مقابل، کدهای غیرهم‌زمان قرار دارند که از Task در دات‌نت استفاده می‌کنند. Task به شما اجازه می‌دهد عملیات‌هایی را در پس‌زمینه اجرا کنید بدون اینکه برنامه اصلی متوقف شود. مثلاً اگر در حال دریافت اطلاعات از یک سرور باشید، برنامه می‌تواند در همان زمان کارهای دیگری نیز انجام دهد.

مزایا

  • برنامه متوقف نمی‌شود و کاربر می‌تواند به راحتی با آن تعامل داشته باشد.
  • برای انجام چندین عملیات هم‌زمان (مثلاً درخواست‌های مختلف به API) بسیار کاربردی است.

معایب

  • ممکن است در ابتدا برای برنامه‌نویس کمی پیچیده باشد، چون باید با مفاهیمی مثل async و await و مدیریت استثناها آشنا باشد.
  • باید مراقب خطاهای هم‌زمانی (Concurrency) باشید تا اجرای کدها به درستی مدیریت شود.

یک مثال از کد هم‌زمان (بدون Task و Async)

فرض کنید می‌خواهید اطلاعاتی را از پایگاه‌داده دریافت کنید. در کد هم‌زمان، عملیات به صورت بلاک‌کننده انجام می‌شود:


public void GetData()
{
    var result = GetDataFromDatabase();  // باید منتظر بماند
    Console.WriteLine(result);
}

public string GetDataFromDatabase()
{
    Thread.Sleep(2000);   // شبیه‌سازی زمان‌بر بودن عملیات
    return "اطلاعات از پایگاه‌داده";
}

همان‌طور که می‌بینید، برنامه تا زمانی که اطلاعات از پایگاه‌داده دریافت نشود هیچ کار دیگری انجام نمی‌دهد.

یک مثال از کد غیرهم‌زمان (با Task و Async)

حالا فرض کنید می‌خواهید همین عملیات را به صورت Async انجام دهید. در این حالت از Task استفاده می‌کنیم تا برنامه متوقف نشود:


public async Task GetDataAsync()
{
    var result = await GetDataFromDatabaseAsync();   // منتظر نمی‌ماند
    Console.WriteLine(result);
}

public async Task GetDataFromDatabaseAsync()
{
    await Task.Delay(2000);    // شبیه‌سازی زمان‌بر بودن عملیات
    return "اطلاعات از پایگاه‌داده";
}

در این حالت عملیات به صورت غیرهم‌زمان اجرا می‌شود و برنامه می‌تواند در همان زمان کارهای دیگر را نیز انجام دهد.


نتیجه‌گیری

  • اگر برنامه شما عملیات سنگین یا چندین کار هم‌زمان ندارد، کدهای هم‌زمان ساده‌تر و مناسب‌تر هستند.
  • اما اگر برنامه با سرور، پایگاه‌داده یا سرویس‌های دیگر در ارتباط است و عملیات زمان‌بر دارد، استفاده از async / await و Task انتخاب بهتری خواهد بود.

در نهایت انتخاب بین کد هم‌زمان و غیرهم‌زمان به نیاز پروژه بستگی دارد. اگر کارایی و پاسخ‌گویی سریع برایتان مهم است، استفاده از Task می‌تواند کمک زیادی کند.

تصویر نویسنده مقاله پویان نبوی

پویان نبوی

.Net Programmer
BitLearn | بیت لرن