我正在编写一种服务,它有五种不同的方法,可能需要5秒到5分钟才能运行.
该服务将安排这些不同的方法以不同的间隔运行.
我不希望任何方法同时运行,所以我如何检查方法是否正在运行并在其完成时将自己排队运行?
安东尼
如果你想要简单,并且所有方法都在同一个类中,你可以使用[MethodImpl]
:
[MethodImpl(MethodImplOptions.Synchronized)] public void Foo() {...} [MethodImpl(MethodImplOptions.Synchronized)] public void Bar() {...}
例如方法,这锁定this
; 对于静态方法,这会锁定typeof(TheClass)
.
因此,这些锁定对象是公共的 - 因此有一个远程(但真正的)机会,另一部分代码可能会锁定它们.创建自己的锁定对象通常被认为是更好的做法:
private readonly object syncLock = new object(); // or static if needed ... public void Foo() { lock(syncLock) { ... } }
等等
旁白:一个奇怪的事实; ECMA规范没有将[MethodImpl]的特定模式定义为"有效",甚至包括私有锁的示例.然而,MS规范坚持这个/ typeof.