如何处理重复 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
我正在为 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