我有一个在控制器上运行缓慢的操作,我已将其转换为新的异步方法。现在它运行得更快了,但任何jQuery Ajax调用它都会返回以下字符串:
System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult]
无需等待异步操作完成。
我在这里做错了什么?我遵循了我能找到的每一个示例,这不是实现起来非常简单的事情。
基本上按照这个视频中概述的方式进行:
http://channel9.msdn.com/Events/TechDays/Techdays-2012-the-Netherlands/2287
还有这个链接:
我知道异步操作不会改变HTTP,但我期望长时间运行的Ajax调用在后台工作,然后在完成后向用户返回结果。这将释放服务器以处理其他ajax调用,而不是阻止它们。
更新:
以下是JavaScript代码:
function doWork(options){
return $.ajax("/getData", {
contentType: 'text/json',
async: true,
success: $.proxy(options.callback, options.scope),
error: function (jqXHR, textStatus, error) {
options.callback.apply(options.scope, [error, textStatus, jqXHR]);
}
});
}
以下是我的C#控制器操作:
[HttpGet]
[AsyncTimeout(60000)]
public async Task<ActionResult> GetData()
{
RestResponse<Data> response = new RestResponse<Data>();
try
{
Data result = null;
await Task.Factory.StartNew(() =>
{
result = ServerImpl.RetrieveData();
});
response.Value = result;
response.HttpStatusCode = 200;
}
catch (Exception ex)
{
response.HttpStatusCode = 500;
response.Value = null;
}
return Json(response, JsonRequestBehavior.AllowGet);
}