gpt4 book ai didi

.net - 不要用System.Threading.Timer来同步?

转载 作者:行者123 更新时间:2023-12-02 08:50:19 24 4
gpt4 key购买 nike

我有一些代码看起来像这样:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com