使用ajax调用进行异步操作的mvc进度

时间:2019-01-26 00:06:09

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

我的服务器执行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

2 个答案:

答案 0 :(得分:4)

  

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

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

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

答案 1 :(得分:2)

会话写入不会立即持续。会话存储在请求的末尾。这对性能有好处。

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

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