睡觉时唤醒任务

时间:2012-06-25 12:20:33

标签: c# multithreading

我有一个定期运行10秒的任务。我通过阅读数据库来做一些图片框刷新过程。我想要的是调用或唤醒线程并在我立即单击按钮时执行刷新操作。简而言之,我希望刷新任务不仅可以由时间驱动,也可以由事件驱动。这可能吗?如果有,怎么样?该任务的代码块如下所示。

while (true)
{
    // do some refresh operation
    Thread.Sleep(10000);
}

void button1_Click(object sender, EventArgs e)
{
    // invoke or awaken thread
}

3 个答案:

答案 0 :(得分:4)

首先,我建议您放弃Thread + Sleep + Invoke组合以进行定时操作。这很难看。 WinForms和WPF都有自定义类来自动执行这三项操作(定期从调度程序线程更新GUI)。查看System.Windows.Forms.TimerSystem.Windows.Threading.DispatcherTimer

现在针对您的具体问题,您可以简单地定义一个常用方法,用您需要的内容更新GUI,并从定时器代码和按钮处理程序中调用它。

答案 1 :(得分:0)

创建AutoResetEvent

protected AutoResetEvent _threadCycle;
_threadCycle = new AutoResetEvent(false);

当你想等待时:

_threadCycle.WaitOne(delay, false);

当你想设置事件时,有效地让线程继续:

_threadCycle.Set();

奖金:

当您执行_threadCycle.WaitOne(delay, false);时,您将获得返回值truefalse,您可以检查超时是否已过期,或者您是否因为手动设置而继续事件

顺便说一句:

只有在备用线程中执行任务时才会起作用。如果你使用主线程,你将无论如何都会等待超时完成。也许使用@Tudors答案是最好的,并且只能通过“荆棘”的方式获得此选项。

答案 2 :(得分:0)

您应该使用AutoResetEvent。

你做的是(假设你的AutoResetEvent被称为'信号'):

while (true)
{
    signal.WaitOne(10000);
    ...
}

在你的按钮处理程序中,只需执行:

signal.Set();