c# - 'await' 之后的代码可以在 ASP.NET 的不同线程中运行吗?
问题描述
我在这里读到https://blog.stephencleary.com/2009/10/synchronizationcontext-properties.html ASP.NET 应用程序的执行上下文没有特定的关联线程。这是否意味着等待之后的代码将(可以)在具有相同上下文的不同线程中执行?在这种情况下,同步执行怎么可能导致死锁?还是 ASP.NET 应用程序不属于这种死锁的情况?
提前致谢。
解决方案
对于ASP.NET Classic (.NET Framework),有一个特殊AspNetSynchronizationContext
的,延续会回发到原来的上下文线程。
ASP.NET Core没有。如果您检查SynchronizationContext.Current
,您会发现它设置为null
. 因此,延续可以自由使用它选择的任何线程,并且在这方面不会遭受典型的死锁
更新
@StephenCleary在评论中的一些重要更正
次要更正:在经典 ASP.NET上,
SynchronizationContext
代表请求上下文,而不是特定线程。该方法可以在. _
await
发生死锁是因为该请求上下文中有一个锁,以确保一次只有一个线程可能在 请求上下文中。因此,当异步方法准备好恢复时,会采用一个线程池线程,该线程 进入请求上下文并尝试获取该 锁。如果上下文中有另一个线程阻塞在该任务上,则该锁已被占用并且将发生死锁
推荐阅读
- reactjs - 如何从打字稿中的锚点击事件发送参数
- azure - 列出与特定密钥保管库关联的 azure vm?
- css - React bootstrap css 接管其他组件样式并更改大小
- node.js - 如何在两个 MongoDB 数据库之间同步两个相同的集合?
- firebase - 一次 Firestore 事务中的 2 次更新
- javascript - 如何将数据从 Angular 表单发送到特定的“文件夹结构”到 Firebase?
- javascript - 带有 socket.io 的 WebRTC/nodejs 中的屏幕共享问题
- excel - 使用 Excel VBA 宏捕获
- rest-assured - 我想使用 java 放心地将嵌套的多个数组作为 json 对象发送
- python - 错误:无效文档:文档必须只有字符串键,键是..将熊猫多索引数据框插入到 mongodb