Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 如何允许多个用户同时执行冗长的mvc3操作并获得良好的响应时间?_Asp.net Mvc 3_Upload_Controller_Cassini - Fatal编程技术网

Asp.net mvc 3 如何允许多个用户同时执行冗长的mvc3操作并获得良好的响应时间?

Asp.net mvc 3 如何允许多个用户同时执行冗长的mvc3操作并获得良好的响应时间?,asp.net-mvc-3,upload,controller,cassini,Asp.net Mvc 3,Upload,Controller,Cassini,我有3-4个与此相关的问题 如果行号X使用同步上传方法,则:- a。同一用户(同一会话)的另一个请求将如何处理:- 与_UploadStatement不同的操作方法?-它是排队还是同时提供服务 相同的操作方法,即_UploadStatement?-是排队还是同时上菜 b。来自不同用户(不同会话)的另一个请求将如何处理:- 与_UploadStatement不同的操作方法?-它是排队还是同时提供服务 相同的操作方法,即_UploadStatement?-是排队还是同时上菜 如果它们被放入队

我有3-4个与此相关的问题

  • 如果行号X使用同步上传方法,则:-

    a。同一用户(同一会话)的另一个请求将如何处理:-

    • 与_UploadStatement不同的操作方法?-它是排队还是同时提供服务

    • 相同的操作方法,即_UploadStatement?-是排队还是同时上菜

    b。来自不同用户(不同会话)的另一个请求将如何处理:-

    • 与_UploadStatement不同的操作方法?-它是排队还是同时提供服务

    • 相同的操作方法,即_UploadStatement?-是排队还是同时上菜

  • 如果它们被放入队列中,那么这意味着下一个用户将不得不等到第一个用户的上传完成


    这些行动将同时发生。每次IIS收到新请求时,它都会创建一个新控制器,并在新控制器实例上执行该操作。但是,每个控制器将使用不同的线程执行请求

    只有当您有这样的代码时,用户B才能等到用户A完成上传:

    public class AbcController : Controller  
    {  
      private static readonly object Lock = new object();
    
      public ActionResult A1()  
      {  
        return view();  
      }  
    
      public JsonResult _UploadStatement(HttpPostedFileBase UploadedStatement)  
      {  
        lock (Lock) 
        {
            // Some web service uploading a lengthy file received to other server (say amazon s3 storage):-  
            // LINE NUMBER - X  
        }
      }  
    }
    
    这样的锁会告诉线程“嘿,一次只允许我们中的一个人执行这个方法。现在我已经锁定了这个方法,你必须等到我完成。当我完成时,我会给你锁,然后你可以执行这个方法,让其他人等着你完成。”

    操作方法不知道或不关心请求来自谁。如果用户A提交了3次上传,IIS将使用不同的线程并行执行所有上传。但是,它可能不会按请求的顺序返回结果。例如,第二个请求可能首先完成,然后是第三个,最后是第一个


    但可能发生的是线程饥饿。假设你有50个用户同时上传3个文件。这意味着至少会从池中提取150个线程,这可能会导致应用程序的其他部分响应更慢。您可以研究从AsyncController进行扩展,以帮助解决由于线程阻塞而严重受限于I/O或潜在的任务上的线程不足情况。

    此行为与Visual Studio Development Server不同还是相同?因为我在VS Web Server.development中看到了不同的结果,它是针对IIS Express开发的,而不是“cassini”开发服务器。IIS将更紧密地匹配生产中发生的情况。我不能说卡西尼号是否使用1个线程来处理所有请求,所以我不得不推迟。但是知道我对卡西尼号的了解,这并不是不可能的。发生的事情是,如果我上传一个大文件,比如说10MB,点击提交,浏览器的加载图标旋转,这意味着请求正在处理中,但与此同时,如果我试图访问另一个操作,通过在浏览器中输入url,屏幕只有在上传完成后才会出现。-这意味着请求已被放入队列。这是您的浏览器阻止了您,而不是web服务器。浏览器将数据推送到服务器时,您需要等待。据我所知,防止这种情况发生的唯一方法是异步上传文件,但据我所知,这并不容易。无论哪种方式,队列都发生在浏览器上,服务器上没有任何东西排队,除非线程不足。不,这不是浏览器阻止我,文件没有从浏览器上载到服务器(该部分仅异步发生),而是使用amazon的web服务从服务器上载到另一台服务器。请参见第X行的注释。
    public class AbcController : Controller  
    {  
      private static readonly object Lock = new object();
    
      public ActionResult A1()  
      {  
        return view();  
      }  
    
      public JsonResult _UploadStatement(HttpPostedFileBase UploadedStatement)  
      {  
        lock (Lock) 
        {
            // Some web service uploading a lengthy file received to other server (say amazon s3 storage):-  
            // LINE NUMBER - X  
        }
      }  
    }