Gre*_*reg 11 c# multithreading static-methods
C#问题 - 我正在尝试确定是否可以使用静态方法,在该方法中它确实使用了一些局部变量.局部变量是否在方法的使用中"共享"?例如,如果从不同的线程同时调用/使用静态方法会发生什么?一个线程阻塞,直到另一个线程完成等吗?
也许通用的问题是,在线程应用程序中,何时"不"使用静态方法?
sea*_*and 21
方法中的局部变量存在于堆栈中,每个线程都有自己的堆栈.因此,多线程使用该方法是安全的.
但是,如果方法本身使用静态变量,那么您应该使用适当的MT保护.您可能正在调用的外部方法也需要安全......
\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| 归档时间: |
|
| 查看次数: |
3440 次 |
| 最近记录: |