SerialPort
.NET を使用した同期通信 (シリアル経由) と、.NETを使用した非同期通信 (イーサネット経由)の両方を実行しようとしていますSocket
。
SerialPort
現在の実装には、との両方を宣言する Connection クラスがSocket
あり、ユーザーが GUI で定義したデバイスの接続タイプ (COM またはイーサネット) に応じて、Connection クラスは適切なシリアル ポートまたはソケット ポートを初期化します。
すべての接続を保持する ConnectionManager があります。したがって、ユーザーが同じ接続情報を使用してデバイスを作成しても、新しい接続は作成されません。代わりに、ConnectionManager にある Connection が割り当てられるだけです。
同期通信と非同期通信を行う必要があるため、これは問題です。何が起こるかというTask
と、デバイスに接続しているときに s を作成するループがあり、それぞれTask
が and を実行しようとしていSend
ますReceive
。ソフトウェアがタスクを作成するよりも、デバイスがタスクを完了するのに時間がかかるため、そこに多くの並行性の問題 (ブロックされたスレッド) です。同期通信を行う必要があるためMutex
、送信前に a をロックし、送信Send
後にミューテックスを解放して、Receive
すべての送信で確実に受信できるようにします。これは良くありません。なぜなら、非同期通信を行おうとすると、ミューテックスが原因で通信が制限されるからです。
私の質問は、非同期通信と同期通信を同時に処理しようとする場合に従うべき最良の設計は何ですか? Send、Receive、Open、Close メソッドを持つ Connection インターフェイスを継承する 2 つの異なる接続クラス (AConnection、BConnection) が必要ですか?
どんな助けでも大歓迎です。