0

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

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

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

3 回答 3

4

首先,我建议您放弃++Thread组合以进行定时操作。这是非常丑陋的。WinForms 和 WPF 都有计时器类来自动完成这三件事(从调度程序线程定期更新 GUI)。查看System.Windows.Forms.TimerSystem.Windows.Threading.DispatcherTimerSleepInvoke

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

于 2012-06-25T12:24:29.023 回答
0

创建一个AutoResetEvent

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

当你想等待时:

_threadCycle.WaitOne(delay, false);

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

_threadCycle.Set();

奖金:

当你这样做时,_threadCycle.WaitOne(delay, false);你会得到一个返回值,true或者false,你可以检查超时是否过期,或者你是否因为手动设置的事件而继续。

顺便提一句:

仅当您在备用线程中执行任务时才有效。如果您使用主线程,无论如何您都会陷入等待超时完成的困境。也许最好使用@Tudors 答案,并且仅以“穿过荆棘”的方式获得此选项。

于 2012-06-25T12:25:01.707 回答
0

您应该为此使用 AutoResetEvent。

您所做的类似于(假设您的 AutoResetEvent 称为“信号”):

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

在您的按钮处理程序中,只需执行以下操作:

signal.Set();
于 2012-06-25T12:27:26.830 回答