不要使用System.Threading.Timer进行同步?

时间:2012-01-20 13:26:23

标签: .net timer locking

我有一些代码如下:

using System.Threading;

public sealed class MyClass : IDisposable {
    private readonly Timer _timer;

   public MyClass() {
        _timer = new Timer(MyCallback);
   }

   public void SomeMethod() {
       lock (_timer) {
           ...
       }
   }

   ...

}

当我运行代码分析(FxCop)时,我收到错误消息
CA2002 : Microsoft.Reliability : 'MyClass.SomeMethod' locks on a reference of type 'Timer'. Replace this with a lock against an object with strong-identity.

I found some documentation here

  

当一个对象可以跨应用程序域边界直接访问时,它被认为具有弱标识。

如何通过appdomains访问我的私人计时器对象?我能想到的唯一原因是Timer类是否包装了一些全局系统句柄,但我不明白锁定中涉及该句柄的方式。

文档页面上有一个弱类列表,但未提及Timer。 MemomoryStream也不在列表中,但它包含在示例中。本地MemoryStream对象如何弱?

2 个答案:

答案 0 :(得分:4)

Timer延伸MarshalByRefObject,这就是为什么它在抱怨,我怀疑。

就我个人而言,我建议只锁定一个私有对象,只有 你的代码才能知道:

using System.Threading;

public sealed class MyClass : IDisposable {
    private readonly Timer _timer;
    private readonly object _mutex = new object();

   public MyClass() {
        _timer = new Timer(MyCallback);
   }

   public void SomeMethod() {
       lock (_mutex) {
           ...
       }
   }

   ...
}

这样您就不必担心Timer是否决定锁定this等。

答案 1 :(得分:2)

您无法确定Timer是否未将自身锁定在其实例上。最好只使用new object()