强制服务中的线程等待另一个线程完成

lit*_*rva 2 .net c# multithreading

我正在编写一种服务,它有五种不同的方法,可能需要5秒到5分钟才能运行.

该服务将安排这些不同的方法以不同的间隔运行.

我不希望任何方法同时运行,所以我如何检查方法是否正在运行并在其完成时将自己排队运行?

安东尼

Mar*_*ell 5

如果你想要简单,并且所有方法都在同一个类中,你可以使用[MethodImpl]:

[MethodImpl(MethodImplOptions.Synchronized)]
public void Foo() {...}

[MethodImpl(MethodImplOptions.Synchronized)]
public void Bar() {...}
Run Code Online (Sandbox Code Playgroud)

例如方法,这锁定this; 对于静态方法,这会锁定typeof(TheClass).

因此,这些锁定对象是公共的 - 因此有一个远程(但真正的)机会,另一部分代码可能会锁定它们.创建自己的锁定对象通常被认为是更好的做法:

private readonly object syncLock = new object(); // or static if needed

...
public void Foo() {
   lock(syncLock) {
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

等等


旁白:一个奇怪的事实; ECMA规范没有将[MethodImpl]的特定模式定义为"有效",甚至包括私有锁的示例.然而,MS规范坚持这个/ typeof.