در برنامهنویسی همروند شما چند Task را که هیچ رابطهای بین آنها نیست در یک محیط همروند اجرا میکنید. این موضوع مشکلات خود را دارد، Taskها از منابع مشترک استفاده میکند و این منابع را بین خود به اشتراک
میگذارند. این امر مشکل منابع اشتراکی را به وجود میآورد، در واقع Taskهای شما به صورت Threadهایی است که از منابع مشترک استفاده میکند و این Threadها مشکل deadlock و data race را به وجود میآورد.
اما در برنامهنویسی موازی یک Task به تعدادی Task مرتب به هم تقسیم و در همان محیط همروند اجرا میشود. شاید فکر کنیم زمانی که این وظایف در ارتباط با هم هستند بعضی از مشکلات موجود در حالت همروند
به قوت خود باقی بماند؛ اما شما چند وظیفه مرتبط به هم ایجاد کردهاید و مشکلی مانند deadlock هنوز به وقت خود باقی است. مساله مهمتر این است که خطایابی این سیستم نسبت به حالت قبلی پیچیده و سختتر
است و همین طور ارتباط بین این وظایف و انتقال اطلاعات بین آنها. اما نگران نباشید اینجاست که Parallel Fx به کمک شما میآید و مشکلات شما را حل میکند.
در Parallel Fx کلاس Task جای Thread را گرفته و امکان اجرای موازی کارها را به شما میدهد و شما میتوانید کار خود را به مراتب سریعتر از چند نخی و حتی برنامهنویسی غیرهمزمان انجام دهید،
حال بگذارید چند مثال در این مورد بنویسیم تا با این کتابخانه و کار با آن آشنا شویم.
Task t = Task.Factory.StartNew(() =»
{
Console.WriteLine("I am the first task");
});
var t2 = t.ContinueWith(delegate
{
//simulate compute intensive
Thread.Sleep(5000);
return "Tasks Example";
});
در کد بالا ما یک Task با استفاده از Lambda Expression ایجاد میکنیم سپس با استفاده از تابع ContinueWith به آن میگوییم هر زمان که کارش تمام شد، این کار را انجام دهد. t2 به صورت غیرموازی اجرا میشود.
در کتابخانه Parallel Fx کلاسهای متعددی برای کارهای متفاوت وجود دارد، یکی از آنها کلاس Parallel است که به شما اجازه میدهد براحتی حلقههای طولانی خود را در یک محیط موازی انجام و زمان اجرای آنها را کاهش دهید:
Stopwatch watch;
watch = new Stopwatch();
watch.Start();
for (int i = 0; i « 10; i++)
{
Thread.Sleep(1000);
}
watch.Stop();
Console.WriteLine("Serial Time: " + watch.Elapsed.Seconds.ToString());
watch = new Stopwatch();
watch.Start();
System.Threading.Tasks.Parallel.For(0, 10, i =»
{
Thread.Sleep(1000);
});
watch.Stop();
Console.WriteLine("Parallel Time: " + watch.Elapsed.Seconds.ToString());
کد بالا دو کار یکسان را ده بار اجرا میکند. انتظاری که شما دارید این است که زمان هر دو یکسان باشد اما همان طور که درخروجی خواهید دید، زمان حلقه اول که به صورت همروند اجرا میشود ده ثانیه و حلقه دوم
سه ثانیه است (این مقدار در سیستمهای مختلف با هستههای مختلف متفاوت است(.