在ASP.NET Core MVC中处理长时间运行的操作可以使用异步方法和后台任务来实现。
一种常见的解决方法是使用Task.Run
方法来执行后台任务,然后在前台返回一个标识符或URL,供前端定期轮询以检查操作的状态。
以下是一个示例代码:
public IActionResult LongRunningOperation()
{
// 启动后台任务
Task.Run(() =>
{
// 长时间运行的操作
// ...
});
// 返回一个标识符或URL
return Json(new { taskId = Guid.NewGuid() });
}
public IActionResult CheckOperationStatus(Guid taskId)
{
// 根据任务标识符检查操作的状态
// ...
return Json(new { status = operationStatus });
}
在前端,您可以使用JavaScript定期轮询CheckOperationStatus
方法来检查操作的状态,并根据状态进行相应的处理。
function checkStatus(taskId) {
$.ajax({
url: '/Controller/CheckOperationStatus',
type: 'POST',
data: { taskId: taskId },
success: function (response) {
if (response.status === 'completed') {
// 操作已完成
// 处理完成后的逻辑
} else if (response.status === 'inprogress') {
// 操作仍在进行中
// 继续轮询
setTimeout(function () {
checkStatus(taskId);
}, 1000);
} else {
// 操作出错
// 处理错误的逻辑
}
},
error: function () {
// 处理错误的逻辑
}
});
}
$(document).ready(function () {
// 启动长时间运行的操作
$.ajax({
url: '/Controller/LongRunningOperation',
type: 'POST',
success: function (response) {
// 获取任务标识符
var taskId = response.taskId;
// 开始轮询操作状态
checkStatus(taskId);
},
error: function () {
// 处理错误的逻辑
}
});
});
这是一种简单的解决方法,您可以根据具体需求进行调整和改进。