默認的await運營商將捕獲當前的「上下文」,並用它來恢復異步方法。
我想這個代碼在我的控制檯應用程序:
static void Main(string[] args)
{
Test().Wait();
}
private static async Task Test()
{
var context = new SynchronizationContext();
SynchronizationContext.SetSynchronizationContext(context);
Console.WriteLine("Thread before: " + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine(await GetResultAsync());
Console.WriteLine("Thread after: " + Thread.CurrentThread.ManagedThreadId);
}
private static async Task<string> GetResultAsync()
{
return await Task.Factory.StartNew(() =>
{
Console.WriteLine("Thread inside: " + Thread.CurrentThread.ManagedThreadId);
return "Hello stackoverflow!";
});
}
...,並得到了這一點:
Thread before: 1
Thread inside: 3
Hello stackoverflow!
Thread after: 3
爲什麼?如果我想在等待之後使用同一個線程,我應該如何設置同步上下文?
他們在這裏明確地使用術語上下文,因爲並不是所有上下文都綁定到單個線程上。在控制檯應用程序中,沒有任何內建理由比其他人更喜歡一個線程(與使用UI線程的UI框架不同)。 –