2009-07-09 52 views
6

我怀疑这也适用于一般的ASP.Net,但我不确定。ASP.Net中的线程安全MVC

如果我有一个控制器上的操作方法,比如说MyController.DoSomethingExciting和三个客户端在同一时间点击它,它本质上是线程安全的,还是我需要做些事情来确保三个并发调用不要互相交流?

回答

13

该方法中的局部变量将是每次调用。我认为(不知道MVC)Controller实例是每个请求,所以任何实例成员都是安全的。

但是,如果有任何静态或其他共享成员,那么他们是不安全的。

+2

控制器实例是每个请求都是正确的 – roryf 2009-07-09 13:09:13

+0

是否每个请求都有一个控制器实例,使其线程安全?或者有没有一种方法可以让一个控制器的实例在同一个请求中被多个线程使用?我想确定是否给控制器一个私有变量,它是线程安全的。 – xr280xr 2015-05-27 22:31:02

2

如果方法实例化所有自己的变量并且不使用任何静态成员,那么它在所有情况下都应该可以。

它的对象一次被多个线程引用,它多次读取一些可以被另一个线程修改的类级变量,然后可能会出现问题。

如果它只读取一次数据并且没有在类级写入任何内容,那么多线程是不成问题的。

2

不一定。取决于“线程安全”的含义。

假设他们共享一个实体框架,比如说“db”,并且它们在某个表上工作。因为你调用你的控制器“MyController”让我们调用这个db.MyTable 每个请求都召唤一个不同的MyController实例。到目前为止,线程安全。每个控制器创建一个MyEntities的实例db = new MyEntities();目前为止线程安全。但由于db.MyTable是IEnumerable类型的<MyTable>,因此它们会相互交互。假设他们在数据库中使用同一个实体(没有锁),比如说db.MyTable [0] - 他们会相互覆盖(“最后一个存储胜利”)。

您网站的3个用户将有三个指向同一位置(在数据库中)的独立指针(在堆栈中)。这不是一个线程问题。这是一个数据锁定问题。