C# 一分钟后重新调用异步控制器操作
我在处理csv文件的MVC3异步控制器上有一个操作,其异步部分如下所示:C# 一分钟后重新调用异步控制器操作,c#,.net,asp.net-mvc,asynchronous,C#,.net,Asp.net Mvc,Asynchronous,我在处理csv文件的MVC3异步控制器上有一个操作,其异步部分如下所示: [HandleError] [NoAsyncTimeout] public void UploadAsync(int jobId) { var timestamp = DateTime.Now; Log.Debug("UploadAsync " + timestamp); var job = _fileUploadService.GetJob(jobId);
[HandleError]
[NoAsyncTimeout]
public void UploadAsync(int jobId)
{
var timestamp = DateTime.Now;
Log.Debug("UploadAsync " + timestamp);
var job = _fileUploadService.GetJob(jobId);
Log.Debug("AsyncManager.OutstandingOperations.Increment " + timestamp);
AsyncManager.OutstandingOperations.Increment();
var task = Task<Job>.Factory.StartNew(() => {
Thread.Sleep(90000);
});
task.ContinueWith(t =>
{
try
{
AsyncManager.Parameters["Results"] = GetJobResultDetails(jobId);
}
//no "catch" block. "Task" takes care of this for us.
finally
{
AsyncManager.OutstandingOperations.Decrement();
}
});
}
当ProcessJob(作业)任务花费不到一分钟的时间时,这种方法可以正常工作。一分钟后,同一任务在另一个线程上再次启动,处理与当前运行的任务相同的任务 对于可能导致这种行为的异步控制器方法或任务,是否有任何明显的超时设置缺失 编辑- 我用thread.Sleep替换了对process job的调用。在一分钟半的时间里,当我查看日志时,我可以看到UploadAsync仍然被调用了两次,因此它与ProcessJob执行的代码无关 值得注意的是,这仅在部署到集成服务器而不是本地时发生 是否有IIS设置需要升级以适应更长的处理时间 编辑- 使用Ajax调用UploadAsync:
$(document).ready(function () {
$("#JobIdToProcess").text(@Model.JobIdToProcess);
var jobId = $("#JobIdToProcess").text();
if (jobId.charAt(0)) {
process(jobId);
}
});
function process(jobId) {
alert("process called");
$.ajax({
type: "GET",
url: makeUrl('~@string.Format("/{0}/{1}", "FileUpload", "Upload")'
+ "/" + jobId),
contentType: "application/json; charset=utf-8",
dataType: "json",
beforeSend: function(xhr) {
$(window).bind('beforeunload', function() {
xhr.abort();
});
},
traditional: true,
success: function (data) {
var uploadResults = $.parseJSON(data);
var completedDate = formatDate(uploadResults[0].CompletedDate);
$("#CompletedDate" + jobId).html(completedDate);
}
});
}
“一分钟后,同一任务在另一个线程上再次启动,处理与当前运行的任务相同的任务”。。。我想你必须分享更多关于这一部分的信息。这种行为可能有几个原因,但似乎还有其他一些代码超时(MVC默认超时为45秒),并且按照它的规则,使用相信的下一项(即当前未完成的项)调用upload函数如何从视图中调用
UploadAsync
操作?你在使用AJAX吗?如果是,请显示相应的代码。
$(document).ready(function () {
$("#JobIdToProcess").text(@Model.JobIdToProcess);
var jobId = $("#JobIdToProcess").text();
if (jobId.charAt(0)) {
process(jobId);
}
});
function process(jobId) {
alert("process called");
$.ajax({
type: "GET",
url: makeUrl('~@string.Format("/{0}/{1}", "FileUpload", "Upload")'
+ "/" + jobId),
contentType: "application/json; charset=utf-8",
dataType: "json",
beforeSend: function(xhr) {
$(window).bind('beforeunload', function() {
xhr.abort();
});
},
traditional: true,
success: function (data) {
var uploadResults = $.parseJSON(data);
var completedDate = formatDate(uploadResults[0].CompletedDate);
$("#CompletedDate" + jobId).html(completedDate);
}
});
}