برنامه نویسی موازی در دات نت (c#.net) قسمت دوم

 
ارسال شده در تاریخ 1394/6/3 توسط admin در زمینه آموزش سی شارپ
 
آموزش زبانهای برنامه نویسی کامپیوتری

ادامه :  

توجه کنید که متد AsyncDemo.DoTimeIntensiveWork() در مثال 1 دستور Task.Run(...)  را فراخوانی میکند که لاندا را به عنوان پارامتر ارسال میکند. این لاندا دارای برخی از  رفتارهای زمانی می باشد  که در دستور Console.WriteLine() و Thread.Sleep() اجرا می شوند. همچنین توجه داشته باشید که کلمه کلیدی await  قبل از دستور  Task.Run(...)  اجرا میگردد. به طور دقیقتر، کلمه کلیدی await  تکه کد صبر کردن را برای Task.Run(...)  اجرا می کند. بنابراین، تکه کد "اتمام اجرا" تا وقتی که دستور  Task.Run(...)  کار خود را تمام نکرده و true بازگشت نداده است اجرا نخواهد شد.

در حالت کلی دستور DoTimeIntensiveWork() به حالت انتظار می رود تا این فرایند به طور نرمال زمان انتظار خود را سپری کند.
ما میدانیم که دستورات بسیار گمراه کننده و گنگ می باشد. نکته مهم این است که به یاد داشته باشید  این است که هنگام استفاده از کلمه کلیدی async، شما یک Task<T> را بازگشت میدهید که در ان T  نوع داده بازگشتی در داخل متد می باشد. مقدار بازگشتی ضمنی از طریق Task.Result قابل دسترسی است.
توجه: Task<T> یک مثال از C# عمومی است. اگر شما نیاز به بررسی این دستور در  C#  دارید، می توانید از MSDN مربوط به سی شارپ استفاده کنید.
موارد زیر برخی از نمونه های رابطه ضمنی بین Task<T> عمومی و Task.Result بازگشت، در هنگام استفاده از کلمه کلیدی async است .
 
    
public async Task DoWork(){ return "foo";}, the value of Task.Result is "foo"
public async Task DoWork(){ return 5;}, the value of Task.Result is 5
public async Task DoWork(){return {"moe","larry","curly"};}, the value of Task.Result is {"moe","larry","curly"}
 
 
 
حال این سوال ایجاد می شود که ما چگونه می توانیم از متد هایی که با استفاده از دستور async  و  awaitساخته شده اند استفاده کنیم؟
 
 
کار با یک Task:
 
مثال 2 نحوه به کار گیری  CanRunAsyncDemoTest() را نشان می دهد. من از دستور CanRunAsyncDemoTest()، به عنوان یک اجرا کننده کد استفاده میکنم. هدف CanRunAsyncDemoTest() این است که به شما نشان دهد چگونه یک Task را از داخل متد می توان بازگشت داد. AsyncDemo.DoTimeIntensiveWork() همان دستوری است که داخل مثال یک مورد بررسی قرار گرفت.
دستور CanRunAsyncDemoTest() وظیفه نوشتن در خروجی کنسول و گزارش شناسه های در حال آزمایش می باشد. همچنین، کد یک object ی  را تولید می کند که از نوع AsyncDemo می باشد. همانطور که در مثال 1 می بینید AsyncDemo async همان محتوای  کد های DoTimeIntensiveWork() می باشد.
لطفا به طور دقیق به خط زیر در داخل سورس کد توجه نمایید 
var task = demo.DoTimeIntensiveWork()
دستور demo.DoTimeIntensiveWork() یک Task<bool> را بازگشت می دهد. توجه داشته باشید که متغیر task دارای متد task.ContinueWith(…)  می باشد.
  
/// 
/// I am using the test as a code runner.
/// No Assert statements are included.
/// 
[TestMethod]
public void CanRunAsyncDemoTest()
{
   var demo = new AsyncDemo();
   Console.WriteLine(@"The threadId for
      BasisTests.CanRunAsyncDemoTest()
      is: {0}
---
",
      Thread.CurrentThread.ManagedThreadId);
   Console.WriteLine("");
   var task = demo.DoTimeIntensiveWork();
   task.ContinueWith((t) =>
      {
         Console.WriteLine(@"
---
task.ContinueWith()
            returns the value: {0}, at: {1}",
            t.Result, DateTime.Now.ToString("hh:mm:ss:fff"));
      });
   Thread.Sleep(1000);
}
 

 

Copyright © 2014 icbc.ir