C# 配置等待(错误)性能测试

C# 配置等待(错误)性能测试,c#,multithreading,performance,async-await,.net-4.6,C#,Multithreading,Performance,Async Await,.net 4.6,无论在哪里,我都读到我应该使用ConfigureWaitFalse来避免死锁和性能原因。我们正在应用程序中使用ConfigureWait。但是可能会删除configurewaitis,因为它会导致不同线程的执行上下文 不同线程的执行上下文有时会导致翻译问题。因为在不同的执行上下文中无法访问currentculture和currentUICulture中的设置区域性 我已经用下面的代码对它进行了一些测试。这对性能没有任何影响。我理解这不是一个好的测试,因为这个简单的测试使用的线程不多 static

无论在哪里,我都读到我应该使用ConfigureWaitFalse来避免死锁和性能原因。我们正在应用程序中使用ConfigureWait。但是可能会删除configurewaitis,因为它会导致不同线程的执行上下文

不同线程的执行上下文有时会导致翻译问题。因为在不同的执行上下文中无法访问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());
}
我应该如何正确地测试它?删除所有ConfigureAwait真的是个坏主意吗?

不要盲目使用ConfigureAwait来提高性能。在编写代码(通常是库代码)时使用它,在相同的线程/同步上下文上恢复并不重要。如果在正确的线程/同步上下文上恢复确实很重要,ConfigureWaitFalse将中断代码,然后不管它的速度有多快。

不要盲目使用ConfigureWait来提高性能。在编写代码(通常是库代码)时使用它,在相同的线程/同步上下文上恢复并不重要。如果在正确的线程/同步上下文上恢复确实重要,那么ConfigureAwaitfalse将中断代码,并且不管它的速度有多快。

使用async await所做的一切都与性能无关,而与响应性和可用性有关

在WinForms、WPF或UWP等客户端UI上,这与响应能力有关。在IO和CPU绑定操作上使用async await进行UI线程外的工作,并配置await False以明确避免返回该UI线程

在ASP.NET.NET Framework上,不是.NET Core,而是关于可用性。您可以使用异步等待IO操作释放线程来处理其他请求,并使用ConfigureAwaitfalse避免将返回到线程设置为HTTP上下文线程

但因为您总是做更多的工作,所以每个逻辑操作将花费更长的时间

在客户端UI上,用户仍然能够使用应用程序,或者至少不会在标题栏和任务管理器上看到“不响应”这一短语

在ASP.NET上,由于有更多的线程可用于处理请求,因此在重载情况下,处理速度会更快,因为允许请求立即开始工作,而不是在请求队列中被阻止。

使用async await所做的一切都与性能无关,而与响应能力和可用性有关

在WinForms、WPF或UWP等客户端UI上,这与响应能力有关。在IO和CPU绑定操作上使用async await进行UI线程外的工作,并配置await False以明确避免返回该UI线程

在ASP.NET.NET Framework上,不是.NET Core,而是关于可用性。您可以使用异步等待IO操作释放线程来处理其他请求,并使用ConfigureAwaitfalse避免将返回到线程设置为HTTP上下文线程

但因为您总是做更多的工作,所以每个逻辑操作将花费更长的时间

在客户端UI上,用户仍然能够使用应用程序,或者至少不会在标题栏和任务管理器上看到“不响应”这一短语


在ASP.NET上,由于有更多线程可用于处理请求,因此在重载情况下,它会更快,因为允许请求立即开始工作,而不是在请求队列中被阻止。

您不需要ConfigureWaitFalse来防止死锁-这些死锁只会在您阻止异步代码时发生,这是你不应该做的。如果你用控制台应用程序之类的东西来测试,它不会有任何区别,因为没有上下文。我会忽略性能差异。如果您在.NET 4.6上看到不同的CurrentCulture/CurrentUICulture值,那么这是一个错误,应该这样报告。您不需要ConfigureWaitFalse来防止死锁-这些死锁只会在第一时间发生,如果您在异步代码上阻塞,这是你不应该做的。如果你用控制台应用程序之类的东西来测试,它不会有任何区别,因为没有上下文。我会忽略性能差异。如果您在.NET 4.6上看到不同的CurrentCulture/CurrentUICulture值,那么这是一个bug,应该这样报告。