2012-11-16 4 views
12

私はWindows.Forms.Timerを私のコードに持っています。私は3回実行しています。ただし、タイマーはダンプ機能をまったく呼び出していません。タイマーはチェックされません

private int count = 3; 
private timer; 
void Loopy(int times) 
{ 
    count = times; 
    timer = new Timer(); 
    timer.Interval = 1000; 
    timer.Tick += new EventHandler(timer_Tick); 
    timer.Start(); 
} 

void timer_Tick(object sender, EventArgs e) 
{ 
    count--; 
    if (count == 0) timer.Stop(); 
    else 
    { 
     // Do something here 
    } 
} 

Loopy()がコード内の他の場所から呼び出されています。

+1

最初の答えは真です:) –

+1

どこからLoopyと呼んでいますか? – Adil

+0

コード内の別の場所からLoopy()が呼び出されています。 – cpdt

答えて

35

ここで働くRxティッカーだSystem.Timersの代わりWindows.Forms.Timer

void Loopy(int times) 
{ 
    count = times; 
    timer = new Timer(1000); 
    timer.Enabled = true; 
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
    timer.Start(); 
} 

void timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    throw new NotImplementedException(); 
} 
+0

+1これまでの唯一の有用な答えです。 – avishayp

+0

恐ろしい!できます!理由は分かりませんが... – cpdt

+2

これがどのように問題を解決できるかは、私には本当に不明です。まったく同じように動作します(ただし、元の問題を再現することはできません)。 – jeroenh

2

あなたは何が間違っているか分かりませんが、このコードは機能します。

public partial class Form1 : Form 
{ 
    private int count = 3; 
    private Timer timer; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Loopy(count); 
    } 

    void Loopy(int times) 
    { 
     count = times; 
     timer = new Timer(); 
     timer.Interval = 1000; 
     timer.Tick += new EventHandler(timer_Tick); 
     timer.Start(); 
    } 

    void timer_Tick(object sender, EventArgs e) 
    { 
     count--; 
     if (count == 0) timer.Stop(); 
     else 
     { 
      // 
     } 
    } 

} 
2

を使用してみてください:もちろん

Observable.Interval(TimeSpan.FromSeconds(1)) 
.Take(3) 
.Subscribe(x=>Console.WriteLine("tick")); 

は、あなたがより有用な何かを購読することができますあなたのプログラム。

+1

これは最高の答えです。イベントハンドラを明示的に追加または削除するのを見るたびに、プリベーキングされたRXソリューションを探したり、イベントハンドリングをラップする拡張メソッドを記述したりします。 Take(3)は3つのサンプルだけでなく、イベントハンドラを破棄してメモリをリークしないことに注意してください。上記のすべての解決策は、イベントを取得した後にイベントハンドラを削除することを忘れてしまいます。 – bradgonesurfing

3

メインUIスレッドではないスレッドでメソッドLoopy()が呼び出された場合、タイマーはチェックされません。 コード内のどこからでもこのメソッドを呼び出す場合は、InvokeRequiredプロパティをチェックする必要があります。あなたのコードは次のようになります(コードがフォームになっていると仮定します)。

関連する問題