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

标签 .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”锁定了“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/

相关文章:

c# - 如何在 Windows 窗体应用程序的文本框中仅允许字母?

C# 到 VB.NET : the **default** keyword?

java - 我想在textView(实时)中显示线程的计时器

c++ - 为什么锁定会减慢顺序文件解析器的速度?

C程序不允许超过n个线程同时执行函数f

java - 锁定获取顺序

c# - ng-grid 的水平滚动 - 2.0.11

c# - 类型化数据集连接 - 需要在 .xsd 文件中有一个吗?

android - 如何在 View 类中设置定时器?

java - TimerTask 停止所有其他执行