C# 只读会话与异步操作和任务线程相结合。那么控制器的行为如何?

C# 只读会话与异步操作和任务线程相结合。那么控制器的行为如何?,c#,asp.net-mvc-3,file-upload,task-parallel-library,asynchronous-method-call,C#,Asp.net Mvc 3,File Upload,Task Parallel Library,Asynchronous Method Call,在Asp.Net MVC应用程序中,如果异步控制器的会话行为是只读的,则其操作方法也是异步的,并且在其中我们创建了一个任务线程来执行一些长时间运行的任务,例如: [SessionState(SessionStateBehavior.ReadOnly)] public class UploadController : AsyncController { public void UploadFilesAsync(IEnumerable<HttpPostedFileBase> as

在Asp.Net MVC应用程序中,如果异步控制器的会话行为是只读的,则其操作方法也是异步的,并且在其中我们创建了一个任务线程来执行一些长时间运行的任务,例如:

[SessionState(SessionStateBehavior.ReadOnly)]
public class UploadController : AsyncController
{
    public void UploadFilesAsync(IEnumerable<HttpPostedFileBase> assetFiles, 
                             string filesMetaInfo)
   {
       var postedFiles = assetFiles;
       var fInfo = filesMetaInfo;

       AsyncManager.OutstandingOperations.Increment();

      Task.Factory.StartNew(
        () => ProcessUploadedFile(postedFiles, fInfo),
        CancellationToken.None, TaskCreationOptions.DenyChildAttach, 
        TaskScheduler.FromCurrentSynchronizationContext());
   }

   public ActionResult UploadFilesCompleted(object result)
   {
      return Json(new
      {
         status = "OK"
      }, "text/plain");
   }

   private void ProcessUploadedFile(IEnumerable<HttpPostedFileBase> 
                     assetFiles, string filesInfo)
   {
          // Do some long running stuff here like file processing.
          // ......................
          // ..................................

          AsyncManager.Parameters["result"] = "success"
          AsyncManager.OutstandingOperations.Decrement();
    }
}
[SessionState(SessionStateBehavior.ReadOnly)]
公共类UploadController:AsyncController
{
public void UploadFileAsync(IEnumerable AssetFile,
字符串文件(元数据信息)
{
var postedFiles=资产文件;
var fInfo=filesMetaInfo;
AsyncManager.OutstandingOperations.Increment();
Task.Factory.StartNew(
()=>ProcessUploadedFile(postedFiles,fInfo),
CancellationToken.None,TaskCreationOptions.Denychildatach,
TaskScheduler.FromCurrentSynchronizationContext());
}
公共操作结果上载文件已完成(对象结果)
{
返回Json(新的
{
status=“确定”
},“纯文本/纯文本”);
}
私有void ProcessUploadedFile(IEnumerable
资产文件、字符串文件信息)
{
//在这里做一些长时间运行的事情,比如文件处理。
// ......................
// ..................................
AsyncManager.Parameters[“结果”]=“成功”
AsyncManager.OutstandingOperations.Decrement();
}
}
现在有两个问题:

  • 当内部任务线程工作完全完成时,此控制器操作方法UploadFileAsync()是否会为其他请求释放此控制器,或者在任务刚开始执行时,此控制器是否可用于其他请求

  • 另外,如果我通过对UploadFileAsync()方法应用“Synchronized”属性使其以同步方式运行,会发生什么?例如:

    [MethodImpl(MethodImplOptions.Synchronized)]

  • 此控制器操作方法是否会上载FileAsync(),释放此 一旦内部任务线程工作,控制器就可以处理其他请求 完全完成,或在 任务刚刚开始执行

    “释放此控制器”的意思是释放当前处理消息的ASP.NET线程池线程。如果是这样,答案是后者。它将立即释放当前线程,而不等待执行的内部任务完成

    如果我让这个UploadFileAsync()方法正常工作,会发生什么 通过对其应用“Synchronized”属性以同步方式

    MethodImplOptions.Synchronized
    不会使方法同步运行。这只不过是用
    lock(this)
    包装执行的整个方法。这意味着多个调用者将无法使用您的
    控制器的同一个实例,但这无论如何都不会发生,因为每个请求都会产生一个新的
    控制器。这意味着这不会有任何区别


    另请注意-,因为卸载到该线程池线程的任何工作都不会向IIS注册,这意味着您的线程可能会由于IIS循环而异常中止。相反,如果您使用的是.NET 4.5.2,请查看
    HostingEnvironment.QueueBackgroundWorkItem
    ,或者查看Stephan Clearys

    ,Stephen Cleary自己的链接提到这是危险且不可靠的解决方案。意味着IIS仍然可以回收它。他还建议像上面那样更好地使用.NET4.5.2。@FaisalMq这就是我引用它的原因:)。这是一篇很棒的文章。嗨,Yuval,我下载了4.5.2运行时和开发者包,并使用了QueueBackgroundWorkItem。我在MSDN博客中看到的一个问题是“AppDomain关闭只能延迟90秒。如果您有太多的项目排队,无法在90秒内完成,ASP.NET运行时将卸载AppDomain,而不等待工作项目完成。”这意味着什么?@FaisalMq这意味着当一个循环想要启动时,注册所有工作的队列有90秒的时间来完成所有工作。如果没有完成,它将关闭AppDomain,您的工作将丢失。90秒应该足够完成正在进行的一切。实际上,我有一个奇怪的场景,我将进一步将web服务器上载的文件流上载到Azure服务器,因此在排队的工作项后台任务中可能需要90秒以上的时间。这是否意味着我有可能无法完成第二个Azure上载任务,IIS回收将在延迟90秒后继续?