【发布时间】:2017-05-19 20:12:03
【问题描述】:
默认情况下,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 框架不同)。
标签: c# asynchronous async-await