C# 服务器未处理多个并行请求
我正在尝试获取控制器方法的进度。我使用了C# 服务器未处理多个并行请求,c#,jquery,ajax,asp.net-mvc,C#,Jquery,Ajax,Asp.net Mvc,我正在尝试获取控制器方法的进度。我使用了setInterval方法在控制器内调用progress方法,但是setInterval内的ajax调用仅在控制器方法执行后命中控制器,在此之前,ajax请求状态在浏览器网络选项卡上保持pending 我考虑过让第一个方法异步 Java脚本代码 function Import() { $('.loader').show(); var checked; if ($('#chkNewCycle').is(":checked")) {
setInterval
方法在控制器内调用progress方法,但是setInterval
内的ajax调用仅在控制器方法执行后命中控制器,在此之前,ajax请求状态在浏览器网络选项卡上保持pending
我考虑过让第一个方法异步
Java脚本代码
function Import() {
$('.loader').show();
var checked;
if ($('#chkNewCycle').is(":checked")) {
checked = 'on';
}
else {
checked = 'off';
}
var NewCycle = { IsNewCycle: checked };
$.ajax({
url: '/DataImport/Import',
type: 'POST',
data: NewCycle,
success: function (result) {
$('.loader').hide();
if (result == "success") {
window.clearInterval(intervalId);
alert("Imported file for processing.");
ClearData();
}
else {
alert(result);
}
}
});
var intervalId = window.setInterval(function () {
$.getJSON('/DataImport/GetProgress', function (json) {
console.log(json.Progress);
$('#progress').html(json.Progress + '%');
});
}, 2000);
}
控制器
public async Task<string> Import(string IsNewCycle)
{
/*Some Code*/
await Task.Run(() => {
/*Some Code*/
int iProgress =Convert.ToInt32(dProgress * 100);
HttpContext.Application["Progress" ] = iProgress;
});
return string;
}
public ActionResult GetProgress()
{
return Json(new
{
Progress = HttpContext.Application["Progress"]
}, JsonRequestBehavior.AllowGet);
}
公共异步任务导入(字符串IsNewCycle)
{
/*一些代码*/
等待任务。运行(()=>{
/*一些代码*/
int iProgress=转换为NT32(数据进程*100);
HttpContext.Application[“Progress”]=iProgress;
});
返回字符串;
}
公共操作结果GetProgress()
{
返回Json(新的
{
Progress=HttpContext.Application[“Progress”]
},JsonRequestBehavior.AllowGet);
}
我需要同时命中这两个控制器方法使用
[SessionState(sessionstatebhavior.ReadOnly)]
属性装饰您的控制器,然后您可以并行执行请求。我认为这应该可以做到!您如何确定它没有同时命中这两个?在Chrome网络选项卡中,多个进度请求状态处于挂起状态。您是否在服务器端握住调试器?是的,它没有命中。一旦第一个ajax调用完成,它就会命中。如果您按住调试器,它就不会命中另一个调试器。尝试使用操作某些数据的日志。看看有没有变化?