逐步更改 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 更有可能不会受益。
在您的代码中混合使用 async
和 sync
操作是完全安全的。当您阻塞同步操作中的异步操作时,使用 "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" 你的层,创建异步副本,直到你可以使控制器动作异步。
您最终会遇到大量代码重复 - 同一方法的同步和异步版本 - 但这只是暂时的。一旦所有其他代码仅使用方法的异步版本,就可以删除同步版本。
我们有一个 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 更有可能不会受益。
在您的代码中混合使用 async
和 sync
操作是完全安全的。当您阻塞同步操作中的异步操作时,使用 "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" 你的层,创建异步副本,直到你可以使控制器动作异步。
您最终会遇到大量代码重复 - 同一方法的同步和异步版本 - 但这只是暂时的。一旦所有其他代码仅使用方法的异步版本,就可以删除同步版本。