c# System.Threading.Timer 等待处理

标签 c# multithreading timer dispose

我有一个使用定时器的类。此类实现 IDispose。我想在 Dispose 方法中等待,直到计时器不再触发。

我是这样实现的:

private void TimerElapsed(object state)
{
    // do not execute the callback if one callback is still executing
    if (Interlocked.Exchange(ref _timerIsExecuting, 1) == 1) 
        return;

    try
    {
        _callback();
    }
    finally
    {
        Interlocked.Exchange(ref _timerIsExecuting, 0);
    }
}

public void Dispose()
{
    if (Interlocked.Exchange(ref _isDisposing, 1) == 1)
        return;

    _timer.Dispose();

    // wait until the callback is not executing anymore, if it was
    while (_timerIsExecuting == 0) 
    { }

    _callback = null;
}

这个实现是否正确?我认为这主要取决于_timerIsExecuting == 0 是否是原子操作的问题。或者我必须使用 WaitHandle。对我来说,这似乎会使代码变得不必要的复杂......

我不是多线程方面的专家,所以很乐意接受任何建议。

最佳答案

除非你有理由不使用 System.Threading.Timer 这有一个 Dispose带有等待句柄的方法

你可以这样做,

private readonly Timer Timer;
private readonly ManualResetEvent TimerDisposed;
public Constructor()
{
    Timer = ....;
    TimerDisposed = new ManualResetEvent(false);
}

public void Dispose()
{
    Timer.Dispose(TimerDisposed);
    TimerDisposed.WaitOne();
    TimerDisposed.Dispose();
}

关于c# System.Threading.Timer 等待处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13396440/

相关文章:

c++ - 什么可能导致 OpenGL 在 "Start Debugging"和 "Start without debugging"选项下表现不同?

c# - 停止等待来自串口的数据包

C# System.IO.File.Exists 在 Unity 中不起作用

c# - 使用LIKE运算符:适用于SQL Server,但不适用于SQLite

c# - 如何在C#中使用TPL实现异步文件下载

android - 如何在后台保持蓝牙连接?

java - 创建每 XXXXms 调用一个方法的计时器

c# - 分词应用

c++ - condition_variable 并不总是有效

javascript - 我们真的需要多线程 JavaScript 吗?