异步控制器操作在一分钟后重新调用

时间:2013-04-25 12:49:15

标签: 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);

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

0 个答案:

没有答案