ASP.NET中的ConfigureAwait(false)的行为是什么?

时间:2017-10-03 15:05:53

标签: c# asp.net .net multithreading task

我正在尝试理解ASP.NET中ConfigureAwait(false)的行为。特别是如果我没有await结果。我的意思的一个例子:

var result = DoSomethingAsync().ConfigureAwait(false);

// do some things other things here. Is our task executing simultaneously?

await result;

从我所读到的,在ASP.NET(不是核心)的上下文中,我理解:

  • ConfigureAwait(false)将阻止在返回应用程序流时重新创建上下文。如果未指定,则仍可以在与原始文件不同的线程上恢复上下文。
  • ConfigureAwait(false)将使用默认的线程池调度程序,并且将不再涉及AspNetSynchronizationContext
  • 在ASP.NET(非核心)中,AspNetSynchronizationContext确保所有任务都按顺序运行(不是并行运行),但每个任务都可以在不同的线程上运行。
  • 在单个请求的上下文中进行并行执行是不可取的,因为它会影响ASP.NET线程池的启发式,而并行化则以处理并行请求的形式出现。使用任务可防止在IO操作期间阻止线程。

假设我所说的一切都是正确的,上面的代码示例会发生什么?从我所读到的,这段代码将导致并行化。如果这是真的,那么这会被认为是非常危险的ASP.NET,每个请求窃取多个线程?

如果不是这样,为什么不呢?在AspNetSynchronizationContext正在同步任务之后,ConfigureAwait(false)不再涉及?

更新:

在我的第三点使用“顺序”这个词是不正确的。我应该说的是“任务将一次运行一个”。对我而言,这意味着不是并行。这取自本文中的信息。下表三分之二描述了每个同步上下文的功能。 ASP.NET同步上下文一次执行一个任务。 https://msdn.microsoft.com/en-us/magazine/gg598924.aspx

鉴于ConfigureAwait(false)将继续执行远离ASP.NET同步上下文并执行默认上下文(一次不执行一个),这是否可能(但不一定)导致请求同时使用多个线程

或者我在这里完全误解了什么?

更新2:

我在以下问题上提出了一个更简洁的问题:

In ASP.NET Classic can ConfigureAwait(false) cause continuations to execute in parallel on multiple threads?

1 个答案:

答案 0 :(得分:4)

ConfigureAwait对DoSomethingAsync()功能的运行没有影响。

var result = DoSomethingAsync().ConfigureAwait(false);

// do some things other things here. Is our task executing simultaneously?

await result;

var result = DoSomethingAsync();

// do some things other things here. Is our task executing simultaneously?

await result.ConfigureAwait(false);

表现完全一样。 ConfigureAwait仅修改await语句的行为。

即使你有.ConfigureAwait(true)你仍然可以同时执行任务,唯一改变的是如何设置await之后的上下文。