在本文https://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-dont-use.html中,建议不要使用Task.Run
。但是,有很多库提供以Async
结尾的方法,因此我希望这些方法返回我可以等待的正在运行的任务(但是这不是必需的,因为这些库可以决定返回同步任务)
上下文是一个ASP.NET应用程序。我应该如何使方法并行运行?
我了解的是,如果异步调用内部包含至少一个“ await”运算符,那么它们将并行执行,问题是最里面的调用应该并行执行以实现该目的,为此我必须采取一些措施到Task.Run
我还看到了一些使用TaskCompletionSource的示例,这是实现“最内部异步方法”以在ASP.NET应用程序中并行运行方法的必要条件吗?
答案 0 :(得分:2)
在ASP.Net应用程序中,我们倾向于根据单个响应时间 1 来评估请求/秒-当然,如果我们要直接权衡一个与另一个。因此,我们不会尝试将更多的 CPU 功能集中在满足一个请求上。
实际上,Task.Run
的目的是将更多的CPU功率集中在一个任务上-这是因为当您有大量的工作要做时,您将无法在当前线程上进行(因为它有自己的工作要做),并且在您可以自由使用尽可能多的CPU时。
在ASP.Net中,异步是在处理I / O时发光的。令人讨厌的缓慢事件,例如访问文件系统或通过网络与数据库对话。美妙的是,在最低级别上,Windows I / O系统已经异步,因此我们don't have to devote a thread just to waiting for things to finish。
因此,您将不会使用Task.Run
。相反,您将寻找公开Async
方法的与I / O相关的对象。如上所述,这些方法本身将不会使用Task.Run
。这确实使我们能够做的是在没有工作要做的情况下,停止使用 any 线程来满足我们的特定请求,从而改善请求的度量标准。
1 这是一个概括,但是单用户/请求ASP.Net网站在我的经验中很少见。