为什么控制器实例变量在mvc中不是线程安全的

时间:2015-07-22 00:01:38

标签: c# asp.net-mvc multithreading

根据文档,实例成员不保证是线程安全的。这对我来说似乎很奇怪,因为在每次请求时都会创建一个新的控制器实例,那么为什么会有任何问题呢?

我想做的是以下内容:

public MyController : Controller {

  private string _myAwesomeUserName;

  protected override void OnAuthorization(AuthorizationContext filterContext) {
    _myAwesomeUserName = "BobIsTheMan";
  }

  public ActionResult ViewSnowboardCollection() {
    return View(_myAwesomeUserName);
  }
}
  

此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。

https://msdn.microsoft.com/en-us/library/system.web.mvc.controller%28v=vs.118%29.aspx

1 个答案:

答案 0 :(得分:1)

  

每个请求都会创建一个新的控制器实例

如果有的话,这会放大访问共享状态的可能性。

MSDN文档中的Thread-Safety声明基本上是样板信息。除非另有说明,否则对象通常无法保证是线程安全的。当然,这并不意味着它们完全不安全,只是因为它们不会保证是线程安全的。

根据Wikipedia's article on thread safety

  

如果一段代码只是以保证多个线程同时安全执行的方式操作共享数据结构,那么它就是线程安全的。

由于控制器可以可能同时访问共享数据,因此无法保证线程安全。