2

私のアプリケーションは、検出したい特定のファイルを正常に検出しますが、メッセージボックスは常に 1 回だけでなく何度も表示されます。何が問題なのかわかりません。

副次的な質問ですが、これは特定のファイルが存在するかどうかを常に確認する良い方法ですか? または、より良い正確な方法がありますか?提案やリンクがある場合は、非常に役立ちます。ありがとう!

これが私のコードです:

private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (File.Exists(patch_to_checked))
            {
                MessageBox.Show("File Found!");
                timer1.Stop();
            }
        }
4

3 に答える 3

4

関数に入ったらすぐにタイマーを停止する必要があります。それ以外の場合、ユーザーがカーソルをボタンに移動してメッセージボックスを閉じる間、タイマーは刻々と過ぎます。

    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Stop();

        if (File.Exists(patch_to_checked))
        {
            MessageBox.Show("File Found!");
        }
        else
        {
            timer1.Start();
        }
    }
于 2012-11-17T12:23:15.957 に答える
2

ダイアログボックスを表示する前に、タイマーを停止する必要があります。

これは、ダイアログボックスが(モーダルに)表示されている間、「タイマー到達」(「ティック」)イベントがキューに入れられるためです。次に、ダイアログボックスが閉じられると、別のそのようなメッセージがアプリケーションに配信され、コードが再度実行され、ダイアログボックスがもう一度表示されます。

メッセージの表示を引き起こすスレッドをブロックしない方法でメッセージを表示することでこれを回避することもできます。これにより、実行は次のステートメントからすぐに続行されます。Tickただし、一般的に、モーダル操作または長時間実行操作を実行する必要がある場合は、イベントの処理中にタイマーを停止するのが最善です。

于 2012-11-17T12:22:56.860 に答える
1
private void timer1_Tick(object sender, EventArgs e)
{
     timer1.Stop();
     if (File.Exists(patch_to_checked))
     {
          MessageBox.Show("File Found!");
     }
    else
     {
        timer1.Start();
     }
}

画面の再描画には時間がかかります。再描画しますが、タイマーの間隔が短いため、感じません。

于 2012-11-17T12:21:41.077 に答える