she*_*nku 6 c# asp.net-mvc multithreading asynchronous async-await
我需要在我的Controller中实现一个异步Action,用于长时间运行的外部API调用.
看一些教程,我已经实现了我的方法:
[AsyncTimeout(200)]
public async Task<ActionResult> DoAsync()
{
// Execute long running call.
return View();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这足以使真正的非块异步吗?我是否还需要应用await运算符,如果是,我该怎么做?
要编写非阻塞异步代码,您需要执行某种现有的非阻塞异步操作,例如Task.Delay()
,或异步网络或文件IO.
简而言之,await
关键字消耗异步; 它不会创造它.
如果你没有任何实际的异步工作,那await
对你没有任何好处.
我需要在我的Controller中实现一个异步Action,用于长时间运行的外部API调用.
...
我的问题是,这是否足以使真正的非块异步?我是否还需要应用await运算符,如果是,我该怎么做?
C#编译器可能已经建议async
关键字在这里是多余的:
[AsyncTimeout(200)]
public async Task<ActionResult> DoAsync()
{
// Execute long running call.
return View();
}
Run Code Online (Sandbox Code Playgroud)
您添加了async
关键字的事实并未使您的方法在后台神奇地运行.
如果您执行其他答案await Task.Run(() => View())
建议的操作,您仍然无法突破给定HTTP请求的边界.请求处理至少需要花费很多时间来生成as .客户端浏览器仍将等待它.View
Task.Run
当您需要将CPU绑定的工作卸载到池线程时,此模式适用于UI应用程序,以避免阻止UI线程并保持UI响应.但是,在ASP.NET应用程序内的HTTP请求处理程序中使用它几乎不是一个好主意.它只会损害性能和可扩展性.
一个解决方案,提供用户友好的体验,当View
需要花费大量时间来编写时,是运行跨越单个HTTP请求的边界的后台任务.然后进一步使用AJAX请求来保持客户端浏览器的进度更新.这是Alan D. Jackson的一个很好的例子,就是这样:
但是,在同一ASP.NET服务器进程内跨多个HTTP请求运行冗长的后台操作并不是一个好主意.虽然它相对容易实现,但这种方法可能会产生IIS可维护性,可伸缩性和安全性方面的问题.
对于单独的Windows/WCF服务,您可能会更好,这会暴露Task
基于API的API.然后使用AJAX定期轮询WCF服务,使用ASP.NET MVC控制器的专用方法作为轮询调用的代理.
归档时间: |
|
查看次数: |
3631 次 |
最近记录: |