【发布时间】:2021-04-22 19:13:05
【问题描述】:
我将System.Treading.Timer 用于Task,它正在检查一些服务器状态和设置标签。我想用按钮启动这个计时器(开始和重复)并在另一个按钮按下后停止它。但我无法做到这一点,我尝试使用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 甚至可以用于这个吗?
【问题讨论】:
-
Task.Run的原因是什么?这对我来说似乎是多余的。它所做的只是调用Dispatcher。Task.Run主要用于将工作卸载到后台线程,我在提供的代码中看不到任何此类工作。 -
这是在 Winforms 中吗?如果是这样:让您的生活更轻松并使用
System.Windows.Forms.Timer。 -
@TheodorZoulias 是的,这是多余的,谢谢
-
@Fildor WPF 我需要 Threading.Timer 因为它是异步的
-
好的,稍微复杂一点。但这里什么是异步? “定时器工作”?
标签: c# multithreading timer