gpt4 book ai didi

c# - 需要一个带有用户反馈的 ASP.NET MVC 长时间运行的进程

转载 作者:IT王子 更新时间:2023-10-29 03:52:38 24 4
gpt4 key购买 nike

我一直在尝试在我的项目中创建一个 Controller 来交付最终可能会非常复杂的报告。因此,它们可能会花费相对较长的时间,而进度条肯定会帮助用户了解事情的进展情况。该报告将通过 AJAX 请求启动,其想法是定期的 JSON 请求将获取状态并更新进度条。

我一直在尝试使用 AsyncController,因为这似乎是运行长进程而不占用资源的好方法,但它似乎没有给我任何检查进度的方法(而且似乎进一步阻止JSON 请求,我还没有发现原因)。在那之后,我尝试诉诸于将进度存储在 Controller 上的静态变量中并从中读取状态 - 但老实说,这一切看起来有点老套!

感谢接受所有建议!

最佳答案

这是我写的一个示例,您可以试试:

Controller :

public class HomeController : AsyncController
{
public ActionResult Index()
{
return View();
}

public void SomeTaskAsync(int id)
{
AsyncManager.OutstandingOperations.Increment();
Task.Factory.StartNew(taskId =>
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(200);
HttpContext.Application["task" + taskId] = i;
}
var result = "result";
AsyncManager.OutstandingOperations.Decrement();
AsyncManager.Parameters["result"] = result;
return result;
}, id);
}

public ActionResult SomeTaskCompleted(string result)
{
return Content(result, "text/plain");
}

public ActionResult SomeTaskProgress(int id)
{
return Json(new
{
Progress = HttpContext.Application["task" + id]
}, JsonRequestBehavior.AllowGet);
}
}

Index() View :

<script type="text/javascript">
$(function () {
var taskId = 543;
$.get('/home/sometask', { id: taskId }, function (result) {
window.clearInterval(intervalId);
$('#result').html(result);
});

var intervalId = window.setInterval(function () {
$.getJSON('/home/sometaskprogress', { id: taskId }, function (json) {
$('#progress').html(json.Progress + '%');
});
}, 5000);
});
</script>

<div id="progress"></div>
<div id="result"></div>

想法是启动一个异步操作,该操作将使用 HttpContext.Application 报告进度,这意味着每个任务都必须有一个唯一的 ID。然后在客户端我们启动任务,然后发送多个 AJAX 请求(每 5 秒)来更新进度。您可以调整参数以适应您的场景。进一步的改进是添加异常处理。

关于c# - 需要一个带有用户反馈的 ASP.NET MVC 长时间运行的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2927284/

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