逐步更改 asp.net 应用程序以使用异步

Changing an asp.net app to use async little by little

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

我想开始使用一些使用异步等待语法的方法的异步版本。

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

不可能一次重写整个应用程序。

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

是否有一些我可以沿途注意的明确警告标志,例如:"never have a sync method call an async method, but it's fine to have async call sync"

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

从使 long-运行 IO 异步开始。短-运行 IO 更有可能不会受益。

在您的代码中混合使用 asyncsync 操作是完全安全的。当您阻塞同步操作中的异步操作时,使用 "sync over async" 是危险的。

只要在更改单个操作时确保它一直是 async,您就可以逐渐添加更多 async 操作。

Where should I Start? is the safe way to do it to make the controllers actions async and work my way down? or the other way around?

我建议从 "leaves" 开始并创建 "vertical partitions"。也就是说,在服务或数据访问层内,识别 I/O-bound 操作。然后创建那些使用自然异步 API 的方法的异步副本。一旦你有了这些,然后继续 "up" 你的层,创建异步副本,直到你可以使控制器动作异步。

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