【发布时间】:2017-11-08 13:29:38
【问题描述】:
我读到的所有地方都应该使用ConfigureAwait(false) 来避免死锁和出于性能原因。我们在我们的应用程序中使用ConfigureAwait。但可能会删除 ConfigureAwaits,因为它会导致不同线程的执行上下文。
不同线程的执行上下文导致(有时)翻译问题。由于 currentculture 和 currentUICulture 中的设置文化在不同的执行上下文中无法访问。
我已经用下面的代码对其进行了一些测试。它没有任何性能差异。我知道这不是一个好的测试,因为这个简单的测试使用的线程并不多。
static async Task MyMethodAsync()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 1000; i++)
{
await Task.Delay(10);
await Task.Delay(10).ConfigureAwait(continueOnCapturedContext: false);
}
stopwatch.Stop();
Console.WriteLine("Await: " + stopwatch.Elapsed.ToString());
}
static async Task MyMethodAsyncNoAwait()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 1000; i++)
{
await Task.Delay(10);
await Task.Delay(10);
}
stopwatch.Stop();
Console.WriteLine(stopwatch.Elapsed.ToString());
}
我应该如何正确测试这个?删除所有 ConfigureAwaits 真的是个坏主意吗?
【问题讨论】:
-
您不应该需要
ConfigureAwait(false)来防止死锁——这些死锁只会在您阻塞异步代码时首先发生,而您不应该这样做。 -
如果您使用控制台应用程序之类的东西进行测试 - 无论如何它不会有任何区别,因为没有上下文。
-
我会忽略性能差异。如果您在 .NET 4.6 上看到不同的
CurrentCulture/CurrentUICulture值,那么这是一个错误,应该这样报告。
标签: c# multithreading performance async-await .net-4.6