4

一部の MCU ハードウェア (センサーの読み取り値など) をリアルタイムで監視できるアプリケーションを構築しています。通信にはCANバスを使用しています。

基本的に、現在2つのスレッドがあります。1 つは GUI が実行されているメイン スレッドで、もう 1 つはデバイス間の通信を管理/監視しています。明らかなことは、データを通信スレッドから GUI スレッドに渡す必要があるということです。しかし、それを行う正しい方法は何ですか?子スレッドが動作を終了したときに、データを呼び出しスレッドに戻す方法は知っていますが、この場合、通信スレッドは常に実行されています。

もちろん、通信ロジックは別のクラス (CANManager) で表されます。

私にはいくつかの独自のアイデアがありますが、これをどのように行うべきか「正しい」方法を知りたいです。

前もって感謝します :)

4

1 に答える 1

5

一般に、どのプログラミング言語でも、スレッド間で通信するための pub-sub アーキテクチャを考慮する必要があります。これは、スレッド B にメッセージを送信したいスレッド A ごとに、そのスレッドからの「メッセージ」またはイベントをキューに投稿し、別のスレッドが解放されたときに消費されるようにする必要があることを意味します。' Cross Thread communication c# ' をグーグルで検索すると、多数の記事を読むことができます。

具体的には、.NET で別の (任意の) スレッドでメソッドまたはデリゲートを呼び出す方法は、SynchronizationContextを使用することです。これは Windows フォームと WPF の両方に共通ですが、WPF には UI スレッドでのみ呼び出す、このフレームワークとは異なる Dispatcher があります。

この種の手法を実行するために利用できるフレームワーク、ライブラリ、パターンは多数あります。それらの 1 つがTask Parallel Libraryです。TPL を使用すると、タスクまたはタスクを作成し、それをスレッドプール、UI、同じまたは特定のスレッドで呼び出すことができます。TPL では、 Schedulersを使用してスレッドをマーシャリングできます。組み込みのスケジューラを使用するか、独自のスケジューラを作成できます。スケジューラは、その中心で SynchronizationContext を使用してスレッドのマーシャリングを行います。

TPL の特に興味深いパターンの 1 つは、1 つのスレッドでデリゲートを実行し、完了時やエラー時など、他のスレッドで複数の操作を連鎖させる機能です。Task Asynchronous Patternを調べ、非同期メソッドから Task を返すことを検討して、 ContinueWith を使用してそれらをチェーンできるようにします。

于 2013-11-22T10:04:35.230 に答える