2010-11-21 13 views
0

私はいくつかのイベント処理コードでプロジェクトを進めています。基本的に、私はタイマーを作成し、タイムアウトイベントのために自分のイベントハンドラをタックします。私はそこにブレークポイントを入れて二重チェックし、イベントハンドラはそのイベントに追加されます(はい、私もタイマーを開始します)。しかし何らかの理由で、イベントハンドラが起動することがありますが、それ以外の場合には発生しません。私はマルチスレッドを使用していますが、それは何とかそれに関連しているかもしれないとは確信しています。イベントハンドラが実行されないことがありますC#

これはあいまいな質問ですが、誰かが似たようなものに遭遇したと思っています。

おかげで、

PM

編集:私は少しさらに問題に見ている、と私は、これは確かにスレッドの問題であることに気づきます。このイベントの原因となるスレッドは、プログラムのネットワーク部分を処理するスレッドであり、ネットワーク上のプログラムの別のインスタンスからの入力を待っているため、すぐにブロックされます。どうすればこの問題を回避できますか?

+0

どのタイマーにタイムアウトイベントがありますか? – Joey

+0

健全性チェック:いつあなたのタイマーを起動しますか( 'myTimer.Start()')、あなたのイベントが発生すると思いますか? – MPelletier

+0

@ジョー:OPは「経過」を意味すると思う。 – MPelletier

答えて

2

私はこの問題をもう少し見てきましたが、これは本当にスレッドの問題であることがわかりました。このイベントの原因となるスレッドは、プログラムのネットワーク部分を処理するスレッドであり、ネットワーク上のプログラムの別のインスタンスからの入力を待っているため、すぐにブロックされます。どうすればこの問題を回避できますか?あなたは(a)のUIコントロールにSynchronizingObjectセットでSystem.Windows.Timers.Timerを持っている、または(b)System.Windows.Forms.Timerを使用しているよう

が鳴ります。次に、ネットワーク読み取りでUIスレッドをブロックし、イベントが発生しないようにします。

2つのオプションがあります。ネットワーク読み込みまたはタイマーイベントに別のスレッドを使用します。 System.windows.Timers.Timerを使用する場合は、SynchronizingObjectを渡さないでください。これにより、ThreadPoolスレッドでイベントが発生します。または、async the network read

+0

問題が解決しました。私はWindows.Forms.Timerを使用していました。私がSystem.Timers.Timerに切り替えると、すべてが機能しました。ありがとう! – user472875

+0

ところで、タイマーのように、自分のカスタムカスタムイベントをThreadPoolスレッドで呼び出すのではなく、ブロックするのですか? – user472875

+0

@ user472875 - ThreadPool.QueueUserWorkItemを使用して、そのようにイベントを呼び出すことができます。または、各デリゲートを繰り返して、BeginInvokeを呼び出します。 –

0

タイマーとはどのような種類のものですか?そのタイマーは何ですか?タイマーが火災の前にガベージコレクションされている可能性はありますか?これについては、System.Windows.Timers.Timerのドキュメントに警告があります。

+0

GC.KeepAliveを両方のタイマーに追加しましたが、結果はありません。この問題は、タイマーを作成したスレッドがすぐにブロックされるために発生することがほとんど確実です。 – user472875

関連する問題