我们有一个asp.net应用程序,它不使用异步或并行方法(除了一些owin中间件)。
我想使用async-await语法开始使用某些方法的异步版本。
我知道混合异步和同步操作存在危险,因为这可能会导致死锁。
无法一次性重写整个应用程序。
我应该从哪里开始?是安全的方法来使控制器操作异步并按我的方式工作?或者反过来?
是否有一些明确的警告标志,我可以一路观看:"永远不会有同步方法调用异步方法,但是没有同步调用同步&#34 ;
答案 0 :(得分:3)
我应该从哪里开始?是安全的方法来使控制器操作异步并按我的方式工作?或者反过来?
我建议从“叶子”开始并创建“垂直分区”。也就是说,在服务或数据访问层中,识别I / O绑定操作。然后创建使用自然异步API的那些方法的异步副本。一旦你有了这些,然后继续“上”你的图层,创建异步副本,直到你可以使控制器动作异步。
你最终会得到相当数量的代码重复 - 同一方法的同步和异步版本 - 但这只是暂时的。一旦所有其他代码仅使用方法的异步版本,就可以删除同步版本。
答案 1 :(得分:2)
您可以安全地混合同步和异步IO。死锁源于await
自动使用环境SynchronizationContext
的方式。像Stream.Read
这样的平台方法几乎从不这样做。
从制作长时间运行的IO异步开始。短期运行的IO更有可能无法受益。
答案 2 :(得分:2)
在代码中混合使用async
和sync
操作是完全安全的。阻止同步操作中的异步操作时使用"sync over async"会有什么危险。
只要您更改单个操作,就可以确保async
一直可以逐步添加更多async
个操作。