ادامه :
توجه کنید که متد 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);
}