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) 任务花费不到一分钟时,这可以正常工作。一分钟后,同一任务在单独的线程上再次启动,处理与当前正在运行的任务相同的作业。

异步控制器方法或可能导致此行为的任务的超时设置是否有任何明显的遗漏?

编辑-

我将进程作业的调用换成了一个线程。睡眠一分半钟,当我查看日志时,我可以看到 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);
        }
    });
}
4

0 回答 0