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を削除することをお勧めしますSleepInvokeとても醜いです。WinFormsとWPFの両方に、これら3つのことを自動的に実行するタイマークラスがあります(ディスパッチャースレッドから定期的にGUIを更新します)。System.Windows.Forms.TimerSystem.Windows.Threading.DispatcherTimerを確認してください。

ここで、特定の質問に対して、必要なもので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 に答える