我有以下簡單的控制檯應用程序:異步/ AWAIT線程化的好奇心
class Program
{
private static int times = 0;
static void Main(string[] args)
{
Console.WriteLine("Start {0}", Thread.CurrentThread.ManagedThreadId);
var task = DoSomething();
task.Wait();
Console.WriteLine("End {0}", Thread.CurrentThread.ManagedThreadId);
Console.ReadLine();
}
static async Task<bool> DoSomething()
{
times++;
if (times >= 3)
{
return true;
}
Console.WriteLine("DoSomething-1 sleeping {0}", Thread.CurrentThread.ManagedThreadId);
await Task.Run(() =>
{
Console.WriteLine("DoSomething-1 sleep {0}", Thread.CurrentThread.ManagedThreadId);
Task.Yield();
});
Console.WriteLine("DoSomething-1 awake {0}", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("DoSomething-2 sleeping {0}", Thread.CurrentThread.ManagedThreadId);
await Task.Run(() =>
{
Console.WriteLine("DoSomething-2 sleep {0}", Thread.CurrentThread.ManagedThreadId);
Task.Yield();
});
Console.WriteLine("DoSomething-2 awake {0}", Thread.CurrentThread.ManagedThreadId);
bool b = await DoSomething();
return b;
}
}
與輸出
Start 1
DoSomething-1 sleeping 1
DoSomething-1 sleep 3
DoSomething-1 awake 4
DoSomething-2 sleeping 4
DoSomething-2 sleep 4
DoSomething-2 awake 4
DoSomething-1 sleeping 4
DoSomething-1 sleep 3
DoSomething-1 awake 3
DoSomething-2 sleeping 3
DoSomething-2 sleep 3
DoSomething-2 awake 3
End 1
我知道,控制檯應用程序不提供這樣的SynchronizationContext運行任務在線程池中。但是令我驚訝的是,當從DoSomething
的等待中恢復執行時,我們就和我們在等待中一樣。我曾假設,當我們恢復等待方法的執行時,我們會返回到我們等待的線程或完全在另一個線程中。
有誰知道爲什麼?我的例子有什麼缺陷?
我有一個與您的代碼示例稍有關聯的問題。 Task.Run是否使用System.Threading.ThreadPool或Windows.System.Threading.ThreadPool?如果是後者,並且您的處理程序使用RunAsync方法進行排隊,則根據http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj248672.aspx,處理程序不應使用async關鍵字。那是對的嗎。或者,這一切是如何工作的? –
我不確定WinRT實現的細節。但是,我可以肯定地說,將'async' lambda傳遞給'Task.Run'是安全的。 –