اکثرا در برنامه نویسی برای ایجاد یک کد asynchronousیا concurrentاز threadاستفاده می کنیم . تو زبان C# یه راه ساده تر وجود داره که بدون نیاز به مدیریت thread ها این کار را انجام بدیم. برای این کار از awaitاستفاده می کنیم.
در زبان برنامهنویسی C#، کلمه کلیدی `await` به همراه`async` برای ایجاد کد همروند (concurrent) و انجام عملیاتهای ناهمگام (asynchronous) استفاده میشود. این ابزار برای انجام عملیاتهای طولانیمدت، مانند فراخوانی وب سرویسها یا دسترسی به پایگاه دادهها، بدون مسدود کردن رشته اصلی برنامه به کار میرود.
شیوه کارش هم به شکل زیره:
1. ابتدا تابعی که میخواهید در آن عملیات ناهمگام انجام دهید، با استفاده از کلمه کلیدی `async` اعلان میشود. به این ترتیب، میتوانید در داخل تابع از `await` استفاده کنید.
2. با استفاده از `await` میتوانید تماس ناهمگام را با یک تابع یا متد انجام دهید که از تابعها یا متدهای ناهمگامی مثل `Task` یا `Task<T>` برگشتی دارند. این متدها معمولاً یک عملیات طولانیمدت را شروع کرده و یک نتیجه نهایی را به صورت ناهمگام بازگردانده یا همچنین بدون بازگشت نتیجه نیز به کار میروند.
3. وقتی از `await` استفاده میکنید، اجرای کد در این نقطه متوقف میشود و نخ اجرایی (thread) به ادامه اجرای دستورات دیگر منتقل نمیشود تا تابع ناهمگام به اتمام برسد.
4. زمانی که تابع ناهمگام به اتمام رسید و نتیجه نهایی آماده شد، اجرای نخ اجرایی به خط بعد از `await` باز میگردد و شما میتوانید نتیجه را به کار ببرید.
در واقع، استفاده از `await` باعث میشود نخ اجرایی اصلی به طور غیرهمگامانه وارد حالت انتظار بیافتد تا عملیات ناهمگام به اتمام برسد. این بهینهسازی کارایی اجازه میدهد تا نخهای اجرایی تا زمان انتظار برای عملیاتهای ناهمگام، به اجرای دستورات دیگر بپردازند و منابع سیستم را به بهترین نحو بهرهبرداری کنند.
برای استفاده از `await`، ابتدا تابع موردنظر را با کلمه کلیدی`async` اعلان میکنیم. سپس در داخل تابع، میتوانیم با استفاده از`await` انتظار برای اتمام یک عملیات ناهمگام را داشته باشیم.
اینجا یک مثال ساده برای نمایش استفاده از `await` درC# آمده است:
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
await DoAsyncOperation();
Console.WriteLine("Async operation completed.");
}
static async Task DoAsyncOperation()
{
using (HttpClient client = new HttpClient())
{
string url = "https://www.example.com";
string result = await client.GetStringAsync(url);
Console.WriteLine("Downloaded content length: " + result.Length);
}
}
}
در این مثال، تابع `Main` با کلمه کلیدی `async` اعلان شده است و در داخل آن تابع `DoAsyncOperation` با استفاده از`await` فراخوانی میشود. وقتی که فراخوانی `GetStringAsync` به اتمام برسد، اجرای تابع `Main` ادامه پیدا میکند.
استفاده از `await` به ما این امکان را میدهد که از سینتکس سادهتری برای برنامهنویسی ناهمگام استفاده کنیم و به طور مؤثر از منابع سیستم بهرهبرداری کنیم بدون اینکه نیاز به ایجاد و مدیریت دستههای نخ (thread) داشته باشیم.