2012-01-12 14 views
4
System.Timers.Timer timer = new System.Timers.Timer(); 

private void button1_Click(object sender, EventArgs e) 
{ 
    timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); 
    timer.Interval = 2000; 

    timer.Enabled = true; 
    timer.Start(); 
} 

private void timer_Elapsed(object myobject, System.Timers.ElapsedEventArgs e) 
{ 
    Say("Time hit" + DateTime.Now.ToString()); 
} 

何が欠けていますか?C#でSystem.Timers.Timerイベントが発生しないのはなぜですか?

EDIT:

を追加しようとしました。これらの好奇心と言う方法が

timer.AutoReset = true;

は次のとおりです。

private void Say(string s) 
     { 

      try 
      { 
       txtSay.AppendText(s + "\r\n"); 
      } 
      catch 
      { 
      } 
     } 

言う方法がそこに問題はありません。他のすべてと連携します。

+6

を参照してください、あなたはButton1をクリックしましたか? ;) –

+0

おっと...真剣に。もちろん私はした –

+2

あなたは '言う'の方法で何をしていますか? –

答えて

5

私は はそのようなコードを変更しよう..あなたは、あなたがクロススレッドの例外を取得していることを述べたdidint思う:

Invoke(new Action(()=>Say("Time hit" + DateTime.Now.ToString()))); 
+0

はい!正確に。なぜあなたはどうしたらいいのですか? –

+1

@IsaacPounder: 'ISynchronizeInvoke'インターフェースを読み込みます。 – leppie

+0

@IsaacPounder:Heh、空のcatchステートメントを削除して、例外メッセージを選択した検索エンジンに貼り付けて貼り付けると、必要なものが見つかるでしょう。 –

0

これは権利ではないかもしれませんが、MSDNの例で行く、あなたはt.Start()を呼び出す必要はありません、t.Enableはそれを開始する必要があります。 t.Enabledとt.Startを実行して起動するので、AutoRestプロパティと競合する可能性があります。

また、私は言ってやる方法がブレークポイントまたは類似した何かを追加することによって、それが必要のように働くことを確認します。私はこのケースでAppendTextを何を呼び出しているのか分かりません。

少しの推測作業です。

+0

いいえ、問題ありません –

0

あなたが方法をクリックしてイベントハンドラを設定する必要はありません。例:あなたのクラスのコンストラクタでそれが動作します。

はクリック機能にstart()メソッドを残す:

private void button1_Click(object sender, EventArgs e) 
{ 
    timer.Start(); 
} 
+0

を試してみてください。動作しません。 Reniuz&Leppieは正しい。 –

5

ため

  1. 別のスレッドに
  2. したがって、あなたのイベントが発生しSyncObjectを設定していない、あなたのTimers.Timer
  3. Textプロパティを設定する
  4. は、クロススレッドの例外を発生させ
  5. そして、あなたはどのトレース

    private void Say(string s) 
    { 
        try 
        { 
         txtSay.AppendText(s + "\r\n"); 
        } 
        catch // empty catch-block: the real fundamental problem 
        { 
        } 
    } 
    

なくても、その例外を飲み込むので、タイマーイベントが火を行いますが、それは隠されたままエラーを生成します。

短い、実用的な解決策は、GUIに関連するタイマーのWindows.Timerを使用することであろう。 Reniuzが言うように

+0

はい、私は実際には、Windowsフォームタイマーで作業していました。しかし、私はこのフォームを使ってテストしていましたが、実際にこのことが必要なのは、GUIではなく(そこにはテキストボックスがありません)。私もその例外をキャッチしていなかったという事実も正しいです。あなたのケースのテキストボックスの例のためのソリューションが動作します。 i + 1nd it –

+0

本当に本当の問題 – V4Vendetta

0

、あなたは別のスレッドからUIを更新しようとしているので、例外を取得する可能性が高いです。 Timerクラスは、アプリケーションの応答性を妨げないように別のスレッドで実行されます。あなたは完全にこれを書き込むことによって、自分自身からのエラーを隠されてきた -

これはtry { /* something */ } catch {}は悪い考えである理由の良い例です。これを書いていないのであれば、例外メッセージから正しいスレッドでUIアップデートを呼び出す必要があることが分かっているはずです。

0

C++/CLI(.NETを使用したマネージC++では、C#では本当に閉じています)では、このタイマーで同期するオブジェクトを設定する必要があります。

それは次のようになります。+ - おそらくC#で

timer->SynchronizingObject = txtSay; 

に ""の代わりに、" - >"

このartice

関連する問題