استفاده از متد WhenAll برای اجرای چندین Task به صورت همزمان در سی شارپ
فرض کنید که داخل یک متد باید چندین متد را به صورت await فراخوانی کنید. به صورت عادی زمانی که متدها فراخوانی می شوند هر بخش await بعد از تکمیل await قبلی اجرا خواهد شد و مقادیر بازگشتی به صورت یکجا در اختیار شما قرار نمیگیرند. برای مثال، کد زیر را در نظر بگیرید:
private async void AsyncBtn_Click(object sender, EventArgs e) { Result1TextBox.Text = (await Task1()).ToString(); Result12extBox.Text = (await Task2()).ToString(); } private Task < long > Task1() { return Task.Run<long>(() = > { var num = Enumerable.Repeat(10, 1000); long sum = 0; foreach (var item in num) { System.Threading.Thread.Sleep(2); sum += item; } return sum; }); } private Task < long > Task2() { return Task.Run<long>(() = > { var num = Enumerable.Repeat(10, 1000); long sum = 0; foreach (var item in num) { System.Threading.Thread.Sleep(2); sum += item; } return sum; }); }
در کد بالا، ابتدا عملیات Task1 انجام شده و نتیجه نمایش داده می شود و پس از آن Task2 اجرا شده و نتیجه نمایش داده می شود. برای رفع وقفه بین اجرای دو Task از متد WhenAll استفاده می کنیم. برای استفاده از متد WhenAll کد BtnAsync_Click را به صورت زیر تغییر می دهیم:
private async void AsyncBtn_Click(object sender, EventArgs e) { var results = await Task.WhenAll(Task1(), Task2()); txtBox.Text = results[0].ToString(); txtSecond.Text = results[1].ToString(); }
با ایجاد تغییر کد بالا، خروجی متد WhenAll یک آرایه از نوع long خواهد بود که هر یک از اندیس های آرایه به ترتیب خروجی متدهای اول و دوم می باشد و به صورت بالا می توان خروجی ها را در TextBox ها نمایش داد.
منبع
قسمت اول آموزش-برنامه نویسی Asynchronous – آشنایی با Process ها، Thread ها و AppDomain ها
قسمت دوم آموزش- آشنایی با ماهیت Asynchronous در Delegate ها
قسمت سوم آموزش-آشنایی با فضای نام System.Threading و کلاس Thread
قسمت چهارم آموزش- آشنایی با Thread های Foreground و Background در دات نت
قسمت پنجم آموزش- آشنایی با مشکل Concurrency در برنامه های Multi-Threaded و راهکار های رفع این مشکل
قسمت ششم آموزش- آشنایی با کلاس Timer در زبان سی شارپ
قسمت هفتم آموزش-آشنایی با CLR ThreadPool در دات نت
قسمت هشتم آموزش- مقدمه ای بر Task Parallel Library و کلاس Parallel در دات نت
قسمت نهم آموزش- برنامه نویسی Parallel:آشنایی با کلاس Task در سی شارپ
قسمت دهم آموزش-برنامه نویسی Parallel در سی شارپ :: متوقف کردن Task ها در سی شارپ – کلاس CancellationToken
قسمت یازدهم آموزش- برنامه نویسی Parallel در سی شارپ :: کوئری های Parallel در LINQ
قسمت دوازدهم آموزش- آشنایی با کلمات کلیدی async و await در زبان سی شارپ
قسمت سیزدهم آموزش- استفاده از متد WhenAll برای اجرای چندین Task به صورت همزمان در سی شارپ