1

適切な作業スレッドのタイマー スレッドで実行されるメソッドを呼び出す必要があります。Invoke/BeginInvoke プロセスが機能しています。データ交換のために 1 つのスレッド間データ コンテナーを共有する 2 つのスレッドがあります。1 つはキューをいっぱいにして、もう 1 つはキューを処理する必要があります。空の状態の後にキューがいっぱいになると、キューはイベントを発生させます。すべての問題は、経過したイベントで新しいスレッドを開くタイマーによって引き起こされます。Dispatcher を使用して正しいスレッドにディスパッチしていますが、この Dispatcher 以外はすべて機能します。:-)

お願いします、誰か問題がどこにあるのか分かりますか?

完全なテスト コードはhttp://pastebin.com/jqYbR9PSにあります。

デバッグ出力は次のとおりです。

App Thread ID: 9
Processor Thread ID: 10
Processor Dispatcher Thread ID: 10
The thread '<No Name>' (0x888) has exited with code 0 (0x0).
Processor QueueListener caller Thread ID: 12
Processor Dispatcher Thread ID: 10
Processor invoking ProcessQueue.
...here shut be processing output...
Processor invoked ProcessQueue.
App Thread ID on end: 9
The thread 'vshost.RunParkingWindow' (0x17c4) has exited with code 0 (0x0).
The thread '<No Name>' (0x820) has exited with code 0 (0x0).
The program '[5760] TestingConsoleApplication.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).

ProcessQueue が呼び出されることはありません。

ありがとうございました。

4

2 に答える 2

4

ディスパッチャに対して呼び出された呼び出しを処理するには、ディスパッチャに対してDispatcher.Run()を呼び出して、実際にディスパッチャを起動する必要があります。

コンソールアプリケーションからディスパッチャーを使用するのはかなり奇妙です。ディスパッチャーはWPFアプリケーションに使用されますが、機能すると思います。

Dispatcher.Run()の呼び出しは戻らないことに注意してください。Dispatcher.BeginInvokeShutdown()を呼び出すまでループに入ります。

例については、このブログ投稿を参照してください。

于 2012-06-08T06:10:08.993 に答える
1

Dispatcher.BeginInvoke は、Windows メッセージ ポンプを使用します。ディスパッチしようとしているスレッド (processingThread) は、メッセージ ポンプを実行していません。

そのスレッドでメッセージ ポンプを実行することもできますが、なぜ EventWaitHandle や他のスレッド同期オブジェクトを使用する代わりにそれを実行するのでしょうか?

また、コード内のキューに対する操作はスレッド セーフではありません。

于 2012-06-08T07:20:06.317 に答える