C# 从不同线程访问静态方法

C# 从不同线程访问静态方法,c#,static,C#,Static,设想一个名为foo()的静态方法需要花费大量时间来执行。此方法位于静态类中 public static class FooClass { public static void Foo() { Thread.Sleep(120000); // 2 minutes. } } 我有两个同一类的实例同时调用这个方法。由于foo类是静态的,这是否意味着Instance2必须等待Instance1完成执行foo()(假定Instance1首先输入了foo() 据我所知,静态类

设想一个名为foo()的静态方法需要花费大量时间来执行。此方法位于静态类中

public static class FooClass
{
   public static void Foo()
   {
      Thread.Sleep(120000); // 2 minutes.
   }
}
我有两个同一类的实例同时调用这个方法。由于
foo类
是静态的,这是否意味着Instance2必须等待Instance1完成执行
foo()
(假定Instance1首先输入了
foo()


据我所知,静态类包含一个在应用程序池中共享的实例。

相同的方法可以“同时”在两个线程上运行,因此两个线程都将休眠。如果需要确保每个调用的方法都是原子的(如果它正在编辑数据),则需要使用锁。

相同的方法可以“同时”在两个线程上运行,因此两个线程都将休眠。如果需要确保每个调用的方法都是原子的(如果它正在编辑数据),则需要使用锁。

否,它们不必等待。两个线程可以同时进入
Foo
,在上面的代码中,每个线程将睡眠2分钟


让一个线程等待另一个线程的唯一方法是添加一个同步/锁定机制,比如
lock
关键字,或者tyes
Mutex
Monitor
(举几个例子)。

不,它们不必等待。两个线程可以同时进入
Foo
,在上面的代码中,每个线程将睡眠2分钟


让一个线程等待另一个线程的唯一方法是添加一个同步/锁定机制,比如
lock
关键字,或者tyes
Mutex
Monitor
(仅举几例)。

您将静态类和静态方法混为一谈。另外,您的代码没有编译,因为您在静态类中有非静态方法。@Ephoric,您能详细解释一下为什么我把静态类和静态方法混为一谈吗?@kidra.pazzo-Dmitry为您解决了这个问题,但您使用了
public void Foo()
而不是
public static void Foo())
没有编译为
FooClass
的被标记为static。啊,很抱歉,你把静态类和静态方法弄混了。另外,您的代码没有编译,因为您在静态类中有非静态方法。@Ephoric,您能详细解释一下为什么我把静态类和静态方法混为一谈吗?@kidra.pazzo-Dmitry为您解决了这个问题,但您使用了
public void Foo()
而不是
public static void Foo())
将不会编译为
FooClass
的被标记为静态。啊,我对此表示歉意,因为这些方法是可重入的?@kidra.pazzo-否。实例方法也是如此,它们也可以由多个线程同时访问。线程和实例/静态成员之间没有直接关系。这是因为方法是可重入的吗?@kidra.pazzo-否。实例方法也是如此,它们也可以由多个线程同时访问。线程和实例/静态成员之间没有直接关系。