C# ASP.NET中ConfigureAwait(false)的行为是什么?
我试图理解ASP.NET中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
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操作期间阻塞线程李>
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);