۱۳۸۹/۱۰/۱۸

اصول برنامه نویسی موازی درNET. نسخه 4 بخش اول - 3

دریافت نتیجه از یک Task

برای دریافت نتیجه از فرایند در حال انجام در قالب یک Task کافی است یک نمونه از کلاس زیر ساخته شود :

Task<T>


T در اینجا نوع متغیری است که از درون Task بازگردانده می شود.برای خواندن مقدار خروجی باید خصوصیت Result از کلاس Task را مورد استفاده قرار دهیم.

مثال :

using System;

using System.Threading.Tasks;

namespace Listing_05 {

class Listing_05 {

static void Main(string[] args) {

// create the task

Task<int> task1 = new Task<int>(() => {

int sum = 0;

for (int i = 0; i < 100; i++) {

sum += i;

}

return sum;

});
// start the task

task1.Start();

// write out the result

Console.WriteLine("Result 1: {0}", task1.Result);

// create the task using state

Task<int> task2 = new Task<int>(obj => {

int sum = 0;

int max = (int)obj;

for (int i = 0; i < max; i++) {

sum += i;

}

return sum;

}, 100);

// start the task

task2.Start();

// write out the result

Console.WriteLine("Result 2: {0}", task2.Result);

// wait for input before exiting

Console.WriteLine("Main method complete. Press enter to finish.");

Console.ReadLine();

}

}

}



البته خواندن نتیجه Task تا زمان پایان یافتن آن طول خواهد کشید یعبارت دیگر در مثال فوق تا زمانی که Task اول پایان نیابد Task دوم آغاز نخواهد شد چون ما قبل از صدا کردن Task دوم از Task اول تقاضای نتیجه کرده ایم.

روش دیگر برای ایجاد Task های دارای نتیجه استفاده از متد استاتیک Task.Factory.StartNew می باشد.مثال:

using System;

using System.Threading.Tasks;

namespace Listing_06 {

class Listing_06 {

static void Main(string[] args) {

// create the task

Task<int> task1 = Task.Factory.StartNew<int>(() => {

int sum = 0;

for (int i = 0; i < 100; i++) {

sum += i;

}

return sum;

});

// write out the result

Console.WriteLine("Result 1: {0}", task1.Result);

// wait for input before exiting

Console.WriteLine("Main method complete. Press enter to finish.");

Console.ReadLine();

}

}

}


چند تنظیم برای ایجاد Task ها :

با استفاده از گزینه هایTaskCreationOptions می‌توان در هنگام ایجاد یک Task تنظیمات مفیدی را به آن اعمال نمود.

None : تنظیمات پیش‌فرض را به Task ایجاد شده اعمال می کند.

LongRunning : تعیین می‌کند که Task زمان اجرای طولانی دارد.
AttachedToParent : تعیین می‌کند که این یک Task فرزند است که به یک Task والد وابستگی دارد.


خصوصیت Task.CurrentId یک عدد منحصربفرد صحیح است که Task فعلی را مشخص می کند. این خصوصیت در خارج از بدنه Task نال می باشد.
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Google
  • Furl
  • Reddit
  • StumbleUpon
  • Donbaleh
  • Technorati
  • Balatarin
  • twitthis

0 نظرات:

ارسال یک نظر