我发出一个ajax请求来调用控制器动作,如下所示:
控制器:
[AsyncTimeout(8000, Order = 3)]
[HandleError(ExceptionType = typeof(TimeoutException), Order = 4, View = "TimeoutError")]
public async Task<JsonResult> RemovePackageAsync(CancellationToken cancellationToken, string packageId, ICollection<int> ids)
{
PackageRemoveItem removeItem = new PackageRemoveItem()
.............blah blah blah
await this.deviceRepository.RemovePackageAsync(removeItem);
return this.Json(JsonConvert.SerializeObject(removeItem.Machines));
}
方法:
public async Task RemovePackageAsync(PackageRemoveItem removeItem, CancellationToken cancelToken = default(CancellationToken))
{
await Task.Run(() =>
{
int[] machines = removeItem.Machines.Keys.ToArray();
.......
});
}
然而,当我在调试中运行它时,我的ajax响应会一直等到我的“RemovePackageAsync”结束。我在这里尝试实现的是在不同的线程上调用此方法,让它执行,而不是等待它完成,但是要立即从控制器获得“真正的”响应。
ajax call =&gt; controller =&gt;在新线程上调用方法,不要等待它完成但是返回true =&gt; let方法只要需要就运行。然后我会做其他的事情
答案 0 :(得分:3)
异步控制器只在内部 Web服务器中工作,以从线程池中释放线程来处理并发请求。浏览器仍然等待同步,以便您的操作返回结果。
你需要的是一个标准的控制器动作,它只产生一个线程或任务并立即返回。
但是这样你就无法返回任何结果数据。