0

Windowsフォーム(C#3.0、.net 3.5 SP1、VS2008 SP1、Vista)にタイマーがあり、停止した後でも機能するようです。コードは次のとおりです。

using System;
using System.Windows.Forms;

namespace TestTimer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            StartTimer();
        }

        private DateTime deadline;

        private void StartTimer()
        {
            deadline = DateTime.Now.AddSeconds(4);
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            int secondsRemaining = (deadline - DateTime.Now).Seconds;

            if (secondsRemaining <= 0)
            {
                timer1.Stop();
                timer1.Enabled = false;
                MessageBox.Show("too slow...");
            }
            else
            {
                label1.Text = "Remaining: " + secondsRemaining.ToString() + (secondsRemaining > 1 ? " seconds" : " second");
            }
        }
    }
}

timer1.Stop()が呼び出された後でも、画面上でMessageBoxを受信し続けます。escを押すと止まります。ただし、メッセージボックスが1つだけ表示されると思っていました...他に何をすればよいですか?timer1.Enabled = falseを追加しても、動作は変わりません。

ありがとう

4

3 に答える 3

5

私は間違っている可能性がありますが、MessageBox.Show()はブロック操作(ダイアログを閉じるのを待つ)ですか?その場合は、Show()呼び出しをStop / Enabled行の後に移動しますか?

于 2009-02-26T11:28:28.993 に答える
1

ここでは、いくつかの要因が働いている可能性があります。

モーダル MessageBox.Show() は、タイマー停止が解除されるまで有効にならない可能性があります (Brian が指摘したように)。

timer1_Tick がバックグラウンド スレッドで実行されている可能性があります。MessageBox.Show() などの UI 呼び出しとバックグラウンド スレッドが混在しないようにします。

どちらの問題も、BeginInvoke を使用してメッセージ ボックスを表示するメソッドを呼び出すことで解決できます。

于 2009-02-26T12:03:51.827 に答える
1

以下は不要であることに注意してください。

            timer1.Stop();
            timer1.Enabled = false;

Stop()と同じEnabled=falseです。そしてStart()と同じEnabled=trueです。

http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.enabled.aspx

于 2011-07-27T01:07:17.020 に答える