如何处理重复 System.Threading.Timer

How to handle repeating System.Threading.Timer

我正在为 Task 使用 System.Treading.Timer,它正在检查一些服务器状态和设置标签。我想用按钮启动这个计时器(开始并重复)并在按下另一个按钮后停止它。但我无法做到这一点,我尝试使用 AutoResetEvent 对象,但我无法理解它是如何工作的。下面是我的代码:

public class Main{
    Timer StatusWatch;
    int WatchStatusTime = 500;
    AutoResetEvent WatchReset = new AutoResetEvent(false);

    public Main(){
        StatusWatch = new System.Threading.Timer(StatusWatchCallBack, WatchReset,
            Timeout.Infinite, WatchStatusTime);
    }

    private async void StatusWatchCallBack(object state)
    {
        WatchReset.WaitOne();

        await Task.Run(() =>
        {
            lblPlcStatus.Dispatcher.Invoke(() =>
            {
                ...
                Timer work
                ...
            });
        });

        WatchReset.Set();
    }

    public void  ButtonClick(){
        if (client.Connected)
        {
            client.Disconnect();
            lblConnect.Content = "Connect";
        }
        else 
        { 
            if (client.ConnectTo(plc.IP, plc.Rack, plc.Slot) == 0)
            {
                lblConnect.Content = "Disconnect";
                WatchReset.WaitOne();
            }
                
        }
    }
}

我不确定如何启动和结束这个计时器。 AutoResetEvent 甚至可以用于此吗?

您可以简单地使用 Change 方法停止和重新启动 System.Threading.Timer

StatusWatch.Change(Timeout.Infinite, Timeout.Infinite); // Stop

StatusWatch.Change(WatchStatusTime, WatchStatusTime); // Restart