我有一些代码如下:
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对象如何弱?
答案 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()
。