Asp.net mvc 使用ajax调用的mvc异步操作进展
我的服务器有一个长时间运行的POST操作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 =&
[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);
}
})
}