静态方法是否共享其本地变量以及在不同线程的并发使用期间会发生什么?

Gre*_*reg 11 c# multithreading static-methods

C#问题 - 我正在尝试确定是否可以使用静态方法,在该方法中它确实使用了一些局部变量.局部变量是否在方法的使用中"共享"?例如,如果从不同的线程同时调用/使用静态方法会发生什么?一个线程阻塞,直到另一个线程完成等吗?

也许通用的问题是,在线程应用程序中,何时"不"使用静态方法?

sea*_*and 21

方法中的局部变量存在于堆栈中,每个线程都有自己的堆栈.因此,多线程使用该方法是安全的.

但是,如果方法本身使用静态变量,那么您应该使用适当的MT保护.您可能正在调用的外部方法也需要安全......


Tim*_*mwi 5

\n

局部变量是否在方法的使用中“共享”?

\n
\n\n

不,他们不是。执行该方法的每个线程都有自己的局部变量副本,并且它们彼此独立。当该方法返回时,该特定线程的局部变量的特定副本将被丢弃。(*)

\n\n
\n

例如,如果从不同线程同时调用/使用静态方法会发生什么?一个线程是否会阻塞,直到另一个线程完成等?

\n
\n\n

不,他们不\xe2\x80\x99t;他们只会同时在两个单独的堆栈上执行该方法。如果您确实希望它们阻塞,请使用lock 语句,这会导致进入 lock 语句的第二个线程等待,直到第一个线程从 lock 语句返回。如果您的方法访问(非本地)字段(共享数据),这可能是必要的。

\n\n
\n

在线程应用程序中,什么时候应该使用静态方法?

\n
\n\n

是否应该使用静态方法取决于该方法是否需要对象来操作,但与您的应用程序是否是多线程无关。出于线程的目的,静态方法与非静态方法相比没有什么特别的。

\n\n

(*) 如果使用局部变量的方法内有 lambda 表达式或匿名方法,则这可能不再成立,但这是一个技术问题。

\n