【问题标题】:Timer (System.Threading) thread safety定时器(System.Threading)线程安全
【发布时间】:2011-03-04 12:01:33
【问题描述】:

有谁知道这段代码是否是线程安全的,或者我在调用 timer2.Change 时是否必须使用锁?

Timer timer1 = new Timer(timerCallback1);
Timer timer2 = new Timer(timerCallback2);
timer1.Change(5000, 5000);
timer2.Change(3000, 3000);

public void timerCallback1(object state)
{
    timer1.Change(Timeout.Infinite, Timeout.Infinite);
    timer2.Change(Timeout.Infinite, Timeout.Infinite);

    DoStuff();

    timer1.Change(5000, 5000);
    timer2.Change(3000, 3000);
}

【问题讨论】:

    标签: c# multithreading timer


    【解决方案1】:

    它是“线程安全的”,因为对 Change 的调用实际上不会破坏计时器。

    但是,从某种意义上说,它不是“线程安全的”,因为您肯定有竞争条件(当您在 DoStuff 中时,无法确保 timerCallback2 没有运行)。

    【讨论】:

    • 谢谢,是的,也许我会在 DoStuff() 之前睡眠,让 timerCallback2 有时间完成,或者我就加个锁。
    【解决方案2】:

    根据 MSDN 文档,Timer 类型是线程安全的,因此您唯一需要注意的地方是您调用 DoStuff();. 的位置

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    相关资源
    最近更新 更多