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

C# ASP.NET中ConfigureAwait(false)的行为是什么?,c#,asp.net,.net,multithreading,task,C#,Asp.net,.net,Multithreading,Task,我试图理解ASP.NET中ConfigureAwait(false)的行为。特别是如果我不等待结果。我的意思的一个例子: var result = DoSomethingAsync().ConfigureAwait(false); // do some things other things here. Is our task executing simultaneously? await result; 从我所读到的内容来看,在ASP.NET(非核心)环境中,我理解: Configur

我试图理解ASP.NET中
ConfigureAwait(false)
的行为。特别是如果我不等待结果。我的意思的一个例子:

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同步上下文一次执行一个任务

假设ConfigureAwait(false)将继续执行ASP.NET同步上下文以外的内容,并执行到默认上下文(一次不会执行一个),这是否可能(但不一定)导致请求同时使用多个线程

还是我完全误解了什么

更新2:

我问了一个更简洁的问题:


配置等待对
DoSomethingAsync()
函数的运行没有影响

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

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

await result;

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


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

ConfigureAwait方法与ASP.NET无关,它是.NET框架的一部分(完整和核心)。是的,我知道。我正在试图了解它对ASP.NET请求和AspNetSynchronizationContext的影响。SynchronizationContext不会运行任务中的代码,它会在
等待
之后运行代码,因此您的许多语句可能会被视为“错误”如果您在其中谈论的任务是从
DoSomethingAsync()
.Sio返回的任务,请解释为什么standard没有回答您的问题,并为您的项目符号语句提供一些链接(特别是“确保所有任务按顺序运行”这一说法非常奇怪)我用更多的信息更新了我的问题。那么DoSomethingAsync是否可以同时等待IO操作完成和线程执行代码直到等待?这意味着您可以在需要时等待结果,从而提高性能。此外,在这段代码中,是否有可能同时使用多个线程?单个请求是否可以同时占用多个线程?您是正确的,如果等待IO,它可以在调用
doworksync()
的初始线程上执行其他工作。如果
DoSomethingAsync()
内部有一个
await foo.ConfigureAwait(false)
,并且您还没有在外部函数中点击
await
,但是内部的
await
完成,那么从技术上讲,您可以让两个线程为同一个“请求”工作,但是,因为同步上下文在内部方法上已经不存在了,所以新线程不再被认为是请求的一部分。我读到的所有内容似乎都表明,一个请求一次只能占用零个或一个线程。这就是为什么您应该避免ASP.NET中的Task.StartNew()/Task.Run()。我从来没有读过任何建议我应该避免ConfigureAwait(false)的文章,但它似乎也有同样的潜在陷阱。@Sio-既然你大概读过一些关于异步代码的文章,你应该知道异步代码不一定会创建新线程。。。这使得您的评论有些混乱,因为您似乎暗示在ASP.Net中仅使用
任务
,就会立即涉及多个线程…@Sio????任务甚至不需要使用线程。。。。您可以启动100次异步读取,并在所有读取时执行
-只有一个线程,所有读取将并行运行。。。或者你的意思与“一个线程不能同时执行两个任务”不同?
var result = DoSomethingAsync();

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

await result.ConfigureAwait(false);