【问题标题】:Updating view with async operation in MVC在 MVC 中使用异步操作更新视图
【发布时间】:2014-05-04 20:11:24
【问题描述】:

我正在编写一个小型内部网络应用程序。 我需要在按下按钮时执行一个很长的操作(可能需要大约一个小时),并在操作完成后告知用户其结果。

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

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

【问题讨论】:

  • 在这种情况下你可以考虑WebSockets实现(SignalR)
  • 看看async await,听起来它可以满足你的需求。
  • ASP.NET 和 IIS 不是针对这么长的操作构建的。您应该将您的工作发布到其他地方(Windows 服务?)并让页面轮询完成。

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


【解决方案1】:

在 AJAX 和 WebSockets 之前的时代,一个低技术的解决方案是简单地不断地将数据写入响应(通常是进度报告)。

因此,您可以调用类似

的方法,而不是异步完成工作
Response.Write("<script>reportProgress(" + progress + ");</script>"); 
Response.Flush();

偶尔。它有其问题,但如果您必须支持奇怪的平台或非常旧的浏览器,它可能仍然是一个好方法。

【讨论】:

    【解决方案2】:

    您可以使用 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”控制器操作可以检查数据库以查看任务是否实际上已完成。

    【讨论】:

      【解决方案3】:

      按照cmets的建议,我建议你看看SignalR,实现起来并不难。
      您必须在您的网站上实现一个服务器,在您的长时间操作完成后向服务器发送一条消息,并在收到消息时刷新您的视图。
      微软的教程应该足够清楚了。

      【讨论】:

        【解决方案4】:

        嗯,

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

        (对不起,我的英语)。

        【讨论】:

          猜你喜欢
          • 2019-11-12
          • 2015-07-26
          • 1970-01-01
          • 1970-01-01
          • 2013-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多