Asp.net mvc 使用ajax调用的mvc异步操作进展

Asp.net mvc 使用ajax调用的mvc异步操作进展,asp.net-mvc,asp.net-mvc-4,async-await,settimeout,polling,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 =&

我的服务器有一个长时间运行的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());
        }
我的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);
                    }

                })
            }
但是,Submit和PollServerForProgress似乎是按顺序进行的

我总是从PollServerForProgress得到1-初始值或100-最终值的响应
不是我期望的1、33、66、100。

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

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


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

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

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

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

Submit和PollServerForProgress似乎是按顺序进行的

对。会话访问受读/写机制保护。如果您有一个具有可写会话访问权限的请求,则会阻止任何其他请求进入该会话。这是故意的

例如,一个选项是在会话外部存储进度数据。或者,您可以将其更改为类似signar调用的方式,这更灵活,因为服务器可以通过进度更新调用客户端

Submit和PollServerForProgress似乎是按顺序进行的

对。会话访问受读/写机制保护。如果您有一个具有可写会话访问权限的请求,则会阻止任何其他请求进入该会话。这是故意的


例如,一个选项是在会话外部存储进度数据。或者,您可以将其更改为类似signar调用的方式,这更灵活,因为服务器可以通过进度更新调用客户端。

在异步操作继续进行时,我是否可以立即从帖子返回?如果是这样,我可以将进度存储在JavaScript@heyNow:这带来了其他问题,比如说,哇,好吧。多亏了你的博客,我才在winforms上实现了这一点!我试图将事情最小化,并避免向代码中添加库,但我想没有其他选择在异步操作继续进行时,我可以立即从帖子中返回吗?如果是这样,我可以将进度存储在JavaScript@heyNow:这带来了其他问题,比如说,哇,好吧。多亏了你的博客,我才在winforms上实现了这一点!我试图将事情最小化,避免向代码中添加库,但我想没有其他选择了
 this.PollServerForProgress = function PollServerForProgress() {


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

                    console.log(response);


                        setTimeout(that.PollServerForProgress, 100);
                    }

                })
            }