//主執行緒ID
Console.WriteLine(string.Format("Main:{0}", System.Threading.Thread.CurrentThread.ManagedThreadId));
//Task執行緒ID
Task t = Task.Run(() => { Console.WriteLine(string.Format("Task:{0}", System.Threading.Thread.CurrentThread.ManagedThreadId)); });
//使用Await呼叫方法
await GetAwaitThreadId();
//等候Task完成
t.Wait();
async Task GetAwaitThreadId()
{
//Await方法執行緒ID
Console.WriteLine(string.Format("Await:{0}", System.Threading.Thread.CurrentThread.ManagedThreadId));
}
另外,當呼叫非同步方法時,在前半部的程式碼(Await之前),依然是原本的執行緒在執行,遇到Await時,原本的執行緒會回到呼叫端
後半部的程式碼(Await之後),會暫時被保留,等到要等待的工作完成以後,會另外找一條執行緒出來執行後半部程式碼
//呼叫方法
Task t = PrintAwaitThreadId();
for (int i = 0; i < 10; i++)
{
//列出目前執行緒
Console.WriteLine(string.Format("Main[{1}]:{0}", System.Threading.Thread.CurrentThread.ManagedThreadId, i));
//產生新的執行緒做時間延遲
await Task.Delay(rnd.Next(1, 10));
}
await t;
async Task PrintAwaitThreadId()
{
for (int i = 0; i < 10; i++)
{
//列出目前執行緒
Console.WriteLine(string.Format("Await[{1}]:{0}", System.Threading.Thread.CurrentThread.ManagedThreadId, i));
//產生新的執行緒做時間延遲
await Task.Delay(rnd.Next(1, 10));
}
}