und*_*oid 0 c# async-await asp.net-core
我读过,asp.net core 没有同步上下文,因此任何异步方法延续都将在线程池上下文中执行。
想象一下,您有一个控制器的 http 操作异步方法,该方法正在等待其他一些方法。这是否意味着下面的任何代码都await应该在与 之前的代码不同的线程中运行await?我的意思是,这是否意味着如果这个方法与像这样的其他方法共享任何对象,我应该关心这个方法内显然是多线程代码中的共享状态(例如在访问共享状态时使用互斥体等) ?
I have read that asp.net core doesn't have a sync context and as such any async method continuation will be executed in a threadpool context.
This is true.
Does that mean that any code bellow the await is expected to run in a different thread than the code until the await?
It might. It will run on any thread pool thread, which may or may not be the same thread that was running the code before the await.
注意:ASP.NET Core 之前的版本具有相同的行为。前 Core ASP.NET 使用的同步上下文不能保证保持在同一线程上。线程可以是任何线程池线程,就像在 Core 中一样;上下文只是处理诸如确保HttpContext.Current引用正确的对象之类的事情(这个静态属性在 Core 中不再存在)。
我的意思是,这是否意味着如果该方法与像这样的其他方法共享任何对象,我应该关心该方法内显然是多线程代码中的共享状态
异步代码是顺序的await(不是“同步”),因此“调用此方法,结果;调用下一个方法,结果”的标准模式await不必担心同一方法内的多线程。线程可能会在整个方法中发生变化,但await会序列化代码执行。
现在,如果代码执行类似Task.WhenAll( 或Task.WhenAny) 的操作,则表明您需要更深入地研究。在这种情况下,代码正在执行并发操作,并且每个任务都可能在不同线程上以多线程方式运行。我在有关该主题的博客文章的“注意隐式并行性”部分中对此进行了介绍。
就像使用互斥锁一样
互斥体 - 具有仅同步 API 和线程仿射状态 - 不适用于任何异步代码。同样,在 ASP.NET pre-Core 中也是如此。
| 归档时间: |
|
| 查看次数: |
802 次 |
| 最近记录: |