c# - 在 ASP.NET 中 ConfigureAwait(false) 的行为是什么?

标签 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 来说是否会被认为是非常危险的,因为每个请求会窃取多个线程?

如果不是真的,为什么不呢?给定 AspNetSynchronizationContextConfigureAwait(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?

最佳答案

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 之后上下文的设置方式。

关于c# - 在 ASP.NET 中 ConfigureAwait(false) 的行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46547770/

相关文章:

c# - ServerCertificateValidationCallback 被忽略

c# - 使用 contains 搜索 linq 关键字

c# - 使用 Roslyn 获取 .cs 以外的文件

asp.net - ASP.NET 2.0或3.5?

c# - 使用 channel ID嵌入YouTube直播

javascript - 与使用 jQuery 调用 Web 服务相关的问题

c# - Rider 要求安装 .NET Framework 4.7.2 Developer Pack,即使它已安装

c# - WinForms 的 MVP 模式 - 访问用户输入的正确方法?

c# - 选择字符串中除特定项目之外的所有内容

c# - 在 winforms 中获取 ISP 提供商名称?