更改asp.net应用程序一点一点地使用异步

时间:2015-02-18 10:41:17

标签: c# asp.net asynchronous async-await deadlock

我们有一个asp.net应用程序,它不使用异步或并行方法(除了一些owin中间件)。

我想使用async-await语法开始使用某些方法的异步版本。

我知道混合异步和同步操作存在危险,因为这可能会导致死锁。

无法一次性重写整个应用程序。

我应该从哪里开始?是安全的方法来使控制器操作异步并按我的方式工作?或者反过来?

是否有一些明确的警告标志,我可以一路观看:"永远不会有同步方法调用异步方法,但是没有同步调用同步&#34 ;

3 个答案:

答案 0 :(得分:3)

  

我应该从哪里开始?是安全的方法来使控制器操作异步并按我的方式工作?或者反过来?

我建议从“叶子”开始并创建“垂直分区”。也就是说,在服务或数据访问层中,识别I / O绑定操作。然后创建使用自然异步API的那些方法的异步副本。一旦你有了这些,然后继续“上”你的图层,创建异步副本,直到你可以使控制器动作异步。

你最终会得到相当数量的代码重复 - 同一方法的同步和异步版本 - 但这只是暂时的。一旦所有其他代码仅使用方法的异步版本,就可以删除同步版本。

答案 1 :(得分:2)

您可以安全地混合同步和异步IO。死锁源于await自动使用环境SynchronizationContext的方式。像Stream.Read这样的平台方法几乎从不这样做。

从制作长时间运行的IO异步开始。短期运行的IO更有可能无法受益。

答案 2 :(得分:2)

在代码中混合使用asyncsync操作是完全安全的。阻止同步操作中的异步操作时使用"sync over async"会有什么危险。

只要您更改单个操作,就可以确保async一直可以逐步添加更多async个操作。