gpt4 book ai didi

asp.net-mvc - 为使用 ASP.NET MVC 2 AsyncController 实现的长时间运行的任务实现进度条

转载 作者:行者123 更新时间:2023-12-03 20:40:06 26 4
gpt4 key购买 nike

看完documentation on AsyncControllers在 ASP.NET MVC 2 中,我想知道在这种情况下实现 ajax 进度条的最佳方法是什么。本教程根本没有涵盖这一点似乎有点奇怪。

我猜实现 AJAX 进度条需要额外的操作方法来返回当前任务的状态。但是,我不确定在工作线程和该操作方法之间交换任务状态信息的最佳方式。

到目前为止,我最好的想法是将有关当前进度的信息与唯一 id 一起放入 Session 字典中,并与客户端共享该 id,以便它可以轮询状态。但也许有一种我没有注意到的更简单的方法。

做到这一点的最佳方法是什么?

谢谢,

阿德里安

最佳答案

非常有趣的问题!其实好像不是AsyncController的任务.异步 Controller 专为在服务器端长时间运行的单 HTTP 查询操作而设计。当您使用异步操作时,这只能帮助您在某些长时间运行的操作期间释放 ASP.Net 工作线程,并允许它在执行操作时为其他请求提供服务。但是从客户端的角度来看,这个异步 Controller 是否无关紧要。对于客户端,这只是单个 HTTP 请求。

您需要在应用程序中使用一些长时间运行的查询服务来重新设计它。这是 Controller 的示例,可以为此类工作流程提供服务:

public class LongOperationsController : Controller
{
public ActionResult StartOperation(OperationData data)
{
Guid operationId = Guid.NewGuid(); // unique identifier for your operation
OperationsService.DoStartOperation(operationId, data); // service starts to perform operation using separate thread
return new JsonResult(operationId); // operation id should be sent to client to allow progress monitoring
}

public ActionResult GetOperationStatus(Guid operationId)
{
var status = OperationsService.GetStatus(operationId); // this method returns some object, that describes status of operation (e.g. progress, current task etc.)
return new JsonResult(status); // returning it to client
}

public ActionResult GetOperationResult(Guid operationId)
{
var result = OperationsService.GetOperationResult(operationId); // this should throw exception if operation is not yet completed
return new JsonResult(result);
}

public ActionResult ClearOperation(Guid operationId)
{
OperationsService.ClearOperationResult(operationId); // we should delete operation result if it was handled by client
return true;
}
}

这是客户端代码,可以与此 Controller 交互:
var operationId;
function startOperation(data) {
$.post('/LongOperations/StartOperation', data, function(response) {
operationId = response; // store operationId
startOperationMonitoring(); // start
}, 'json');
}

function startOperationMonitoring() {
// todo : periodically call updateOperationStatus() to check status at server-side
}

function updateOperationStatus() {
// todo : get result of GetOperationStatus action from controller
// todo : if status is 'running', update progress bar with value from server, if 'completed' - stop operation monitoring and call finishOperation()
}

function finishOperation() {
// todo : get result of GetOperationResult action from controller and update UI
// todo : call ClearOperation action from controller to free resources
}

这是非常基本的概念,这里有一些遗漏的项目,但我希望你能理解主要思想。此外,如何设计此系统的组件取决于您,例如:
  • 对 OperationsService 使用单例,
    或不;
  • 操作结果应该存储在哪里和多长时间(DB?缓存?
    session ?);
  • 是否真的需要手动释放资源,什么时候做
    客户端停止监视操作
    (用户关闭浏览器)等

  • 好运!

    关于asp.net-mvc - 为使用 ASP.NET MVC 2 AsyncController 实现的长时间运行的任务实现进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4322126/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com