ตัวอย่างนี้แสดงให้เห็นถึงความแตกต่างอย่างชัดเจน ด้วย async / รอเธรดการโทรจะไม่บล็อกและดำเนินการต่อ
static void Main(string[] args)
{
WriteOutput("Program Begin");
// DoAsTask();
DoAsAsync();
WriteOutput("Program End");
Console.ReadLine();
}
static void DoAsTask()
{
WriteOutput("1 - Starting");
var t = Task.Factory.StartNew<int>(DoSomethingThatTakesTime);
WriteOutput("2 - Task started");
t.Wait();
WriteOutput("3 - Task completed with result: " + t.Result);
}
static async Task DoAsAsync()
{
WriteOutput("1 - Starting");
var t = Task.Factory.StartNew<int>(DoSomethingThatTakesTime);
WriteOutput("2 - Task started");
var result = await t;
WriteOutput("3 - Task completed with result: " + result);
}
static int DoSomethingThatTakesTime()
{
WriteOutput("A - Started something");
Thread.Sleep(1000);
WriteOutput("B - Completed something");
return 123;
}
static void WriteOutput(string message)
{
Console.WriteLine("[{0}] {1}", Thread.CurrentThread.ManagedThreadId, message);
}
DoAsTask เอาท์พุท:
[1] โปรแกรมเริ่มต้น
[1] 1 - การเริ่มต้น
[1] 2 - งานเริ่มต้น
[3] A - เริ่มอะไรบางอย่าง
[3] B - เสร็จบางสิ่งบางอย่าง
[1] 3 - งานเสร็จสิ้นด้วยผลลัพธ์: 123
[1] สิ้นสุดโปรแกรม
เอาต์พุต DoAsAsync:
[1] โปรแกรมเริ่มต้น
[1] 1 - การเริ่มต้น
[1] 2 - งานเริ่มต้น
[3] A - เริ่มอะไรบางอย่าง
[1] สิ้นสุดโปรแกรม
[3] B - เสร็จบางสิ่งบางอย่าง
[3] 3 - ภารกิจเสร็จสิ้นด้วยผลลัพธ์: 123
อัปเดต: ปรับปรุงตัวอย่างโดยแสดง ID เธรดในเอาต์พุต
Task
ที่ใช้เวลา 10 ms จริง ๆ แล้วจะรันTask
บนเธรดของคุณนาน 10 ชั่วโมงซึ่งจะบล็อกคุณตลอด 10 ชั่วโมง