我的服务器执行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);
}
})
}
但是,Submit
和PollServerForProgress
似乎是顺序发生的。
我总是从PollServerForProgress收到1 -- iniial value
或100 -- final value
的响应
不是我所期望的1, 33, 66, 100
。
答案 0 :(得分:4)
Submit和PollServerForProgress似乎是顺序发生的。
是的。会话访问受读/写机制保护。如果您有一个具有可写会话访问权限的请求,则将阻止任何其他请求进入同一会话。这是设计使然。
与usr stated一样,一种选择是在会话的 外部存储进度数据。另外,您可以将其更改为SignalR调用之类的名称,这种方法更加灵活,因为服务器可以通过进度更新来调用客户端。
答案 1 :(得分:2)
会话写入不会立即持续。会话存储在请求的末尾。这对性能有好处。
我不确定是否可以直接写入会话。我对此没有太多经验。
您可以将进度信息写入一些持久性数据存储,例如数据库(或redis甚至其他缓存)。