我对处理csv文件的MVC3异步控制器有一个动作,其异步部分如下:
[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();
}
});
}
完成的对应方是:
public JsonResult UploadCompleted(int jobId)
{
Log.Debug("UploadCompleted");
try
{
return AsyncManager.Parameters.ContainsKey("Results")
? Json(AsyncManager.Parameters["Results"],
JsonRequestBehavior.AllowGet)
: Json("", JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
ExceptionHelper.LogError(ex, Log, "message");
return Json("");
}
}
当ProcessJob(作业)任务花费不到一分钟时,这可以正常工作。一分钟后,在一个单独的线程上再次启动相同的任务,处理与当前正在运行的任务相同的作业。
对于可能导致此行为的异步控制器方法或任务的超时设置,是否有任何明显的遗漏?
编辑 -
我将调用交换到了一个线程的进程作业。睡了一个半小时,当我查看日志时,我可以看到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);
}
});
}