在MVC中使用异步操作更新视图

时间:2014-03-26 12:16:15

标签: c# asp.net-mvc model-view-controller async-await

我正在编写一个小型内部网络应用。 我需要在按下按钮的情况下进行非常长的操作(可能需要大约一个小时),并在操作完成后让用户知道其结果。

换句话说,我需要按钮来启动异步操作,并在结果完成后刷新视图(大约一小时后)。

编辑:操作可以在视图中使用某种刷新机制。结果可以在一小段滞后后发送到视图(不必实时刷新)

4 个答案:

答案 0 :(得分:3)

你可以使用SignalR,但这可能有点矫枉过正。另一个选项是设置另一个控制器操作,检查任务是否已完成。然后,在客户端,您可以使用jQuery向该控制器操作发出ajax请求。当操作完成后,您可以显示警告或以其他方式更新页面。

$.ajax({
    type: 'GET',
    url: http://mysite.info/tasks/checkComplete/5,
    success: function (response) {
        if (response == 'true') {
            alert('Task complete');
        }         
    }
});

至于服务器端发生的事情,我不认为这是我会使用async / await的情况。如果你的任务真的要运行一个小时,我会感觉你会遇到超时问题,等等。我会有一个控制器动作,用于启动任务,但它完全放了在数据库中启动的请求。然后我会有一个外部"工人"它检查该数据库中的请求并执行任务。任务完成后,它将更新该数据库条目以将其标记为完成。然后" CheckComplete"我上面的示例中的控制器操作可以检查数据库以查看任务是否实际完成。

答案 1 :(得分:0)

根据评论中的建议,我建议您查看SignalR,这并不难实现。
您必须在您的网站上实施服务器,在长时间操作完成后向服务器发送消息,并在收到消息时刷新您的视图。
微软的教程应该足够明确。

答案 2 :(得分:0)

从AJAX和WebSockets之前的时代开始的一种低技术解决方案就是不断地将数据写入响应(通常是进度报告)。

因此,不是异步地进行工作,而是调用

之类的东西
Response.Write("<script>reportProgress(" + progress + ");</script>"); 
Response.Flush();
偶尔会有一段时间。它有它的问题,但如果你必须支持奇怪的平台或非常古老的浏览器,它可能仍然是一个好方法。

答案 3 :(得分:-1)

嗯,嗯,

完成工作后,我将尝试在服务器中创建标志。     在MVC中,您可以创建一个TIMER obj,例如每分钟检查服务器是否已完成工作,并在不阻止应用程序的新线程中启动此计时器。

(抱歉,我的英文)。