我有一个web api与控制器方法是这样的:
public HttpResponseMessage DoSmth() {
doingSmth();
}
我读过关于服务器线程如何在这里:为什么我应该返回Task
业务数据访问层的实现是同步的(并且巨大)),并且没有时间将所有内容重构为async task<>
。是否有某种方法可以只重构控制器,即"topmost"?方法是异步的,所以服务器不会耗尽线程?
是否有办法只重构控制器,即"topmost"方法是异步的,所以服务器不会耗尽线程?
号
你可以这样想:同步调用阻塞线程。只要你的业务逻辑/DAL方法是同步的,它们就会阻塞线程。
正如一些人在评论中指出的那样,Task.Run
将允许这些方法阻塞线程池线程而不是调用线程,这对许多GUI应用程序来说是一个很好的方法(阻塞线程池线程而不是GUI线程),但它在服务器应用程序上是适得其反的(阻塞一个线程池线程而不是另一个线程池线程)。
我建议首先分析你的应用程序,确定哪些请求是最慢的或最频繁调用的,并将其更改为async
。在创建同步方法的异步等效时,可以使用标志参数hack (attribution: me)来避免逻辑/DAL类型中的代码重复。