0

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);
        }
    });
}
4

0 に答える 0