2011-08-05 3 views
4

デバッグ中に、Timer.Stop()またはTimer.Enabled = falseコマンドが実行された後に、Timerがまだ実行中であることがわかります(Timer.Enabled = true)。そんなことがあるものか?Windowsフォームタイマは停止しません。そんなことがあるものか?

+2

...このコードを試してみてくださいあなたは、おそらくいくつかのコード –

+0

を示さなければならないし、コードのほかに、どのようにそれを始めていますか? – gbianchi

+1

@gbianchiコードのそばでどうやって始めますか? –

答えて

7

あなたはワーカースレッドにタイマーを停止する場合、これは可能です。たとえば:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 
    Timer timer1; 
    protected override void OnLoad(EventArgs e) { 
     base.OnLoad(e); 
     timer1 = new Timer(); 
     timer1.Interval = 3000; 
     timer1.Start(); 
     var t = new System.Threading.Thread(stopTimer); 
     t.Start(); 
    } 
    private void stopTimer() { 
     timer1.Enabled = false; 
     System.Diagnostics.Debug.WriteLine(timer1.Enabled.ToString()); 
    } 
} 

出力:タイマーはUIスレッドによって停止されなければならない

、クラスが自動的にそれの世話をします。 Control.BeginInvoke()とよく似ています。明示的なレースがあり、Tickイベントハンドラは停止した後に実行できます。これは、作成した最初のタイマーがワーカースレッド上に作成されている場合に、UIスレッドでも発生します。たとえば、スプラッシュ画面。それは健康ではありません、あなたはそれを修正するべきです。

3

呼び出しを開始するStopを呼び出してTimerを無効にすると、Timerは中断された間隔を再開します。タイマーが5000ミリ秒の間隔で設定されていて、約3000ミリ秒でStopを呼び出す場合、Startを呼び出すと、タイマーはTickイベントを発生させる前に5000ミリ秒待機します。また、心のすべてのタイマーコンポーネントは、メインアプリケーションスレッドで動作するため、Windowsは、アプリケーション内の他のタイマーコンポーネントからのメッセージを引き起こす可能性があり、アプリケーションがすぐに処理されるようにフォーム内の任意のタイマーの停止を呼び出す

クマ。 2つのTimerコンポーネントがあり、1つが700ミリ秒に設定され、1つが500ミリ秒に設定され、最初のTimerでStopを呼び出すと、アプリケーションは2番目のコンポーネントのイベントコールバックを最初に受信することがあります。これが問題になることが判明した場合は、代わりにSystem.Threading名前空間でTimerクラスを使用することを検討してください。

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

1
public void EnableTimer(bool state) 
{ 
    if (this.InvokeRequired) { 
     this.Invoke(new Action<bool>(EnableTimer), state); 
    } else { 
     this.Timer1.Enabled = state; 
    } 
} 

関連する問題