بدون هیچ مطلب اضافی به سراغ اولین مثال می رویم. قطعه کد زیر را در نظر بگیرید :
using System;
using System.Threading.Tasks;
namespace Listing_01 {
class Listing_01 {
static void Main(string[] args) {
Task.Factory.StartNew(() => {
Console.WriteLine("Hello World");
});
// wait for input before exiting
Console.WriteLine("Main method complete. Press enter to finish.");
Console.ReadLine();
}
}
}
در کد بالا کلاس Task نقش اصلی را بازی می کند.این کلاس قلب کتابخانه برنامه نویسی Task یا
Task Programming Library می باشد.
در این بخش با موارد زیر در مورد Task ها آشنا می شویم:
- ایجاد و به کار انداختن انواع مختلف Task ها.
- کنسل کردن Task ها.
- منتظر شدن برای پایان یک Task.
- دریافت خروجی یا نتیجه از یک Task پایان یافته.
- مدیریت خطا در طول انجام یک Task
خب بهتر است به شرح کد بالا بپردازیم:
رای استفاده از کلاس Task باید فضای نام System.Threading.Tasks را بصورت ریر مورد استفاده قرار دهیم.
using System.Threading.Tasks;
این فضای نام نقش بسیار مهمی در برنامه نویسی Task ها دارد . فضای نام بعدی معروف است :
System.Threading . اگر با برنامه نویسی ترید ها بروش مرسوم وکلاسیک آشنایی دارید قطعاً با این فضای نام آشنایی دارید. اگر بخواهیم با چندین Task بطور همزمان کار کنیم به این فضای نام نیاز مبرم داریم. پس :
خب رسیدیم به بخش مهم برنامه :
Task.Factory.StartNew(() => {
Console.WriteLine("Hello World");
});
متد استاتیک Task.Factory.StartNew یک Task جدید را ایجاد و شروع میکند که متن Hello Word را در خروجی کنسول نمایش می دهد. این روش سادهترین راه برای ایجاد و شروع یک Task است.
در بخشهای بعدی چگونگی ایجاد Task های پیچیدهتر را بررسی خواهیم کرد . خروجی برنامه بالا بصورت زیر خواهد بود:
Main method complete. Press enter to finish.
Hello World
روشهای مختلف ایجاد یک Task ساده :
- ایجاد کلاس Task با استفاده از یک متد دارای نام که در داخل یک کلاس Action صدا زده می شود. مثال :
Task task1 = new Task(new Action(printMessage));
- استفاده از یک delegate ناشناس (بدون نام). مثال :
Task task2 = new Task(delegate {
printMessage();
});
- استفاده از یک عبارت لامبدا و یک متددارای نام . مثال :
Task task3 = new Task(() => printMessage());
- استفاده از یک عبارت لامبدا و یک متد ناشناس (بدون نام). مثال :
Task task4 = new Task(() => {
printMessage();
});
قطعه کد زیر مثال خوبی برای چهار روشی که در بالا شرح دادیم می باشد:
using System;
using System.Threading.Tasks;
namespace Listing_02 {
class Listing_02 {
static void Main(string[] args) {
// use an Action delegate and a named method
Task task1 = new Task(new Action(printMessage));
// use a anonymous delegate
Task task2 = new Task(delegate {
printMessage();
});
// use a lambda expression and a named method
Task task3 = new Task(() => printMessage());
// use a lambda expression and an anonymous method
Task task4 = new Task(() => {
printMessage();
});
task1.Start();
task2.Start();
task3.Start();
task4.Start();
// wait for input before exiting
Console.WriteLine("Main method complete. Press enter to finish.");
Console.ReadLine();
}
static void printMessage() {
Console.WriteLine("Hello World");
}
}
}
خروجی برنامه بالا بصورت زیر است :
Main method complete. Press enter to finish.
Hello World
Hello World
Hello World
Hello World
کته 1 : از مند استاتیک Task.Factory.StartNew برای ایجاد Task هایی که رمان اجرای کوتاه دارند استفاده می شود.
نکته 2 : اگر یک Taskدر حال اجرا باشد نمیتوان آنرا دوباره استارت نمود باید برای یک نمونه جدید از آن Task ایجاد نمود و آنرا استارت کرد.