我有一些代码看起来像这样:
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”锁定了“Timer”类型的引用。将其替换为针对具有强身份的对象的锁。
I found some documentation here .
An object is said to have a weak identity when it can be directly accessed across application domain boundaries.
如何跨应用域访问我的私有(private)计时器对象?我能想到的唯一原因是 Timer 类是否包装了一些全局系统句柄,但我不明白该句柄如何参与锁定。
文档页面上有一个弱类列表,但没有提到 Timer。 MemomoryStream 也不在列表中,但包含在示例中。本地 MemoryStream 对象怎么会弱?
最佳答案
Timer
扩展 MarshalByRefObject
,我怀疑这就是它提示的原因。
我个人建议只锁定只有您的代码可以知道的私有(private)对象:
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
等
关于.net - 不要用System.Threading.Timer来同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8942104/