1つのソース(シリアルポート)と多くのコンシューマー(ユーザーコントロール)がある場合。次に、間接参照の別のレイヤーを追加する必要があります。シリアルポートクラスの所有者であるクラスを作成し、そこからすべてのデータをある種のバッファに読み込みます(DataReceivedイベントに反応し、新しいデータをリスト、キューなどに入れます)。このバッファはこのクラスから公開され、さらに独自のイベントがあります(DataReceived?)。これで、すべてのコンシューマーがこのイベントをリッスンし、バッファーを調べて目的のデータを見つけることができます。
主な問題は、共有バッファーからデータを削除することです。これは、バッファー全体が必要か、バッファーの一部のみが必要かは、コンシューマーによって異なるためです。各コンシューマーがどの時点からバッファー内でのみ機能するかをプロデューサーに通知し、全員がバッファーの先頭を超えた場合にプロデューサーにバッファーを削減させる方法について考えてみてください。ただし、インデックスが変更されたことを消費者に再通知する必要があることに注意してください。
また、すべてのコンシューマーがデータを受信するたびに独自のローカルバッファーを作成し、その場合、すべてのコンシューマーが必要に応じて独自のバッファーを削減できる場合は、共有バッファーが大きくなるという問題を回避できます。
アプリケーション全体のメモリフットプリントを小さくするために最初のアプローチの複雑さが必要な場合、どちらの戦略がより理にかなっているのかは状況によって異なります。