1

我对此有 3-4 个相关问题。

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

    一种。如何为来自同一用户(同一会话)的另一个请求提供服务:-

    • 与_UploadStatement 不同的操作方法?- 它会同时排队或服务吗?

    • 相同的动作方法即_UploadStatement?- 它会被放入队列中还是同时提供?

    湾。如何为来自不同用户(不同会话)的另一个请求提供服务:-

    • 与_UploadStatement 不同的操作方法?- 它会同时排队或服务吗?

    • 相同的动作方法即_UploadStatement?- 它会被放入队列中还是同时提供?

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

public class AbcController : Controller  
{  
  public ActionResult A1()  
  {  
    return view();  
  }  

  public JsonResult _UploadStatement(HttpPostedFileBase UploadedStatement)  
  {  
    // Some web service uploading a lengthy file received to other server (say amazon s3 storage):-  
    // LINE NUMBER - X  
  }  
}
4

1 回答 1

3

这些动作将并行发生。每次 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  
    }
  }  
}

这样的锁会告诉线程“嘿,一次只允许我们一个人执行这个方法。现在我已经锁定了方法,你必须等到我完成。当我完成时,我会把锁交给你,然后你就可以执行方法,让其他人等你完成。”

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

但是可能发生的是线程饥饿。假设您有 50 个用户,每个用户同时上传 3 个文件。这意味着将从池中取出至少 150 个线程,这可能会导致应用程序的其他部分响应更慢。您可以考虑从 AsyncController 进行扩展,以帮助处理因线程阻塞而受到大量 I/O 限制或以其他方式潜伏的任务的线程饥饿场景。

于 2012-07-09T20:24:05.370 回答