【发布时间】:2013-09-29 00:10:48
【问题描述】:
如果您在 ASP.NET MVC 中执行以下代码,您可以在调试窗口中看到它会在 await 之后正确恢复线程的文化,即使 ManagedThreadId 发生变化:
public async Task<ActionResult> Index()
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
Debug.WriteLine(Thread.CurrentThread.ManagedThreadId);
Debug.WriteLine(Thread.CurrentThread.CurrentUICulture);
await SomeMethod();
Debug.WriteLine(Thread.CurrentThread.ManagedThreadId);
Debug.WriteLine(Thread.CurrentThread.CurrentUICulture);
return View();
}
private async Task SomeMethod()
{
await Task.Delay(100).ConfigureAwait(false);
}
然后我只是将 ConfigureAwait(false) 从 SomeMethod() 移动到 Index(),除此之外,它与上面的代码相同:
public async Task<ActionResult> Index()
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
Debug.WriteLine(Thread.CurrentThread.ManagedThreadId);
Debug.WriteLine(Thread.CurrentThread.CurrentUICulture);
await SomeMethod().ConfigureAwait(false);
Debug.WriteLine(Thread.CurrentThread.ManagedThreadId);
Debug.WriteLine(Thread.CurrentThread.CurrentUICulture);
return View();
}
private async Task SomeMethod()
{
await Task.Delay(100);
}
现在它不会恢复我的文化,但总是将其设置为 new CultureInfo("en-US")。但我希望使用这两种方法,结果必须相同。完全不清楚,为什么会这样。
【问题讨论】:
-
ConfigureAwait(true)是做什么的?bool参数控制是否“在原始上下文中编组”——这不是你想要的吗? -
我预计如果我将
ConfigureAwait(false)添加到await它将影响整个异步调用链,而不仅仅是当前方法,因为否则使用它几乎没有性能优势。
标签: c# asp.net asp.net-mvc task-parallel-library async-await