C# 如何处理重复的System.Threading.Timer

C# 如何处理重复的System.Threading.Timer,c#,multithreading,timer,C#,Multithreading,Timer,我正在使用System.Treading.Timer执行任务,检查一些服务器状态和设置标签。我想用按钮(开始和重复)启动计时器,并在按下另一个按钮后停止。但我无法做到这一点,我尝试使用AutoResetEvent对象,但我很难理解它是如何工作的。下面是我的代码: public class Main{ Timer StatusWatch; int WatchStatusTime = 500; AutoResetEvent WatchReset = new AutoReset

我正在使用
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
是否可用于此功能?

您只需使用以下方法即可停止并重新启动
系统.Threading.Timer


执行
任务的原因是什么。运行
?这对我来说似乎是多余的。它所做的只是调用
调度程序
任务.Run
主要用于将工作卸载到后台线程,我在提供的代码中看不到任何此类工作。这是在Winforms中吗?如果是这样的话:让你的生活更轻松,使用
System.Windows.Forms.Timer
@TheodorZoulias是的,这是多余的,谢谢you@Fildor我和WPF需要Threading.Timer,因为它是asyncOk,稍微复杂一点。但是什么是异步的呢?“计时器工作”?
StatusWatch.Change(Timeout.Infinite, Timeout.Infinite); // Stop

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