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(job) タスクの所要時間が 1 分未満の場合、これは正常に機能します。1 分後、同じタスクが別のスレッドで再び開始され、現在実行中のジョブと同じジョブが処理されます。
この動作を引き起こす可能性のある非同期コントローラーメソッドまたはタスクのタイムアウト設定について、私が見逃している明らかなものはありますか?
編集-
プロセス ジョブの呼び出しを thread.Sleep に 1 分半置き換えました。ログを確認すると、UploadAsync がまだ 2 回呼び出されているため、ProcessJob が実行するコードとは関係ありません。
これは、ローカルではなく統合サーバーにデプロイされた場合にのみ発生することに注意してください。
より長い処理時間に対応するために、IIS 設定を更新する必要がある可能性はありますか?
編集 -
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);
}
});
}