我发现这篇文章:在 ASP.NET MVC 和 Web API 中取消长时间运行的查询非常有用。我将在这里总结这篇文章。
开始之前的快速说明:
- 我正在运行 MVC5,而不是 ASP.NET Core MVC。
- 当我离开页面或使用 jQuery 取消操作时,我希望能够取消操作
abort
。
我最终得到了这样的结果:
// Just add the CancellationToken parameter to the end of your parameter list
public async Task<ActionResult> GetQueryDataAsync(
int id,
CancellationToken cancellationToken)
{
CancellationToken dcToken = Response.ClientDisconnectedToken;
var linkTokenSrc = CancellationTokenSource
.CreateLinkedTokenSource(
cancellationToken,
dcToken
);
using (var dbContext = new Entities())
{
var data = await dbContext.ComplicatedView
/* A bunch of linq statements */
.ToListAsync(linkTokenSrc.Token)
.ConfigureAwait(true);
// Do stuff and return data unless cancelled
// ...
}
}
由于我使用的是 MVC5,因此我不得不使用文章中规定的解决方法,即读取Response.ClientDisconnectedToken
并链接令牌源。
如果您改用 ASP.NET Core MVC,您应该可以CancellationToken
直接使用该参数,而不必根据文章链接它。
在此之后,我所要做的就是确保abort
在我离开页面时在 JavaScript 中编辑了 XHR。