【问题标题】:mvc progress of async operation using ajax call使用ajax调用的异步操作的mvc进度
【发布时间】:2019-06-19 19:51:49
【问题描述】:

我的服务器有一个长时间运行的 POST 操作

[HttpPost]
        public async Task<ActionResult> LongOperation()
        {
            var s = (int)System.Web.HttpContext.Current.Session["p"];
            IProgress<int> progress = new Progress<int>(value => s = value);

            await Task.Run(() =>
                    {
                        Task.Delay(2000);
                        progress.Report(33);
                    })
                   .ContinueWith(prevTask =>
                   {
                       Task.Delay(2000);
                       progress.Report(66);
                   })
                    .ContinueWith(prevTask =>
                    {
                        Task.Delay(2000);
                        progress.Report(100);
                    });

            return View("Index", new TempModel());
        }

我正在尝试通过 GET 方法监控其进度

public ContentResult GetProgress()
        {
            var session = (int)System.Web.HttpContext.Current.Session["p"];
            return Content(session.ToString());
        }

我的 jQuery 调用了初始 POST 请求..

this.Submit = function(){
  $.post("@Url.Action("LongOperation", "MyController")", function (response) {

 }
}

...并定期监控进度

 this.PollServerForProgress = function PollServerForProgress() {


                $.get("@Url.Action("GetProgress", "MyController")", function (response) {

                    console.log(response);


                        setTimeout(that.PollServerForProgress, 100);
                    }

                })
            }

但是,SubmitPollServerForProgress 似乎是按顺序发生的。

我总是从 PollServerForProgress 得到响应为 1 -- iniial value100 -- final value 不像我期望的那样1, 33, 66, 100

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 async-await settimeout polling


    【解决方案1】:

    会话写入不会立即持续。会话存储在请求结束时。这对性能有好处。

    我不确定是否有直接写入会话的方法。我对此没有太多经验。

    您可以将进度信息写入一些持久性数据存储,例如数据库(或 redis 甚至其他缓存)。

    【讨论】:

      【解决方案2】:

      Submit 和 PollServerForProgress 似乎是按顺序发生的。

      是的。会话访问受读/写机制保护。如果您有一个具有可写会话访问权限的请求,那么这会阻止任何其他请求进入同一会话。这是设计使然。

      作为usr stated,一种选择是将进度数据存储在会话之外。或者,您可以将其更改为类似 SignalR 调用的方式,这样更灵活,因为服务器可以通过进度更新调用客户端。

      【讨论】:

      • async 操作继续进行时,我可以立即从我的帖子返回吗?如果是这样,我可以将进度存储在 JavaScript 的本地存储中
      • @heyNow:这带来了其他问题,例如ASP.NET has no idea you have operations in progress
      • 哇好。我在 winforms 上得到了这个工作(感谢你的博客!)我试图保持最小化并避免在我的代码中添加库,但我想没有其他选择
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 2021-07-09
      • 2020-01-17
      • 2017-09-09
      • 1970-01-01
      相关资源
      最近更新 更多