我有一个定期运行10秒的任务。我通过阅读数据库来做一些图片框刷新过程。我想要的是调用或唤醒线程并在我立即单击按钮时执行刷新操作。简而言之,我希望刷新任务不仅可以由时间驱动,也可以由事件驱动。这可能吗?如果有,怎么样?该任务的代码块如下所示。
while (true)
{
// do some refresh operation
Thread.Sleep(10000);
}
void button1_Click(object sender, EventArgs e)
{
// invoke or awaken thread
}
答案 0 :(得分:4)
首先,我建议您放弃Thread
+ Sleep
+ Invoke
组合以进行定时操作。这很难看。 WinForms和WPF都有自定义类来自动执行这三项操作(定期从调度程序线程更新GUI)。查看System.Windows.Forms.Timer和System.Windows.Threading.DispatcherTimer。
现在针对您的具体问题,您可以简单地定义一个常用方法,用您需要的内容更新GUI,并从定时器代码和按钮处理程序中调用它。
答案 1 :(得分:0)
创建AutoResetEvent
:
protected AutoResetEvent _threadCycle;
_threadCycle = new AutoResetEvent(false);
当你想等待时:
_threadCycle.WaitOne(delay, false);
当你想设置事件时,有效地让线程继续:
_threadCycle.Set();
奖金:
当您执行_threadCycle.WaitOne(delay, false);
时,您将获得返回值true
或false
,您可以检查超时是否已过期,或者您是否因为手动设置而继续事件
顺便说一句:
只有在备用线程中执行任务时才会起作用。如果你使用主线程,你将无论如何都会等待超时完成。也许使用@Tudors答案是最好的,并且只能通过“荆棘”的方式获得此选项。
答案 2 :(得分:0)
您应该使用AutoResetEvent。
你做的是(假设你的AutoResetEvent被称为'信号'):
while (true)
{
signal.WaitOne(10000);
...
}
在你的按钮处理程序中,只需执行:
signal.Set();