2010-12-10 16 views
16

私のアプリケーションでは、データの読み取りと書き込みに.NET SerialPortクラスを使用します。読み込みはDataReceivedイベントを使用して行われ、私はThreadPoolスレッドで内部的に仮定します。書き込みはUIスレッド(WinForms)によって行われます。.NET SerialPortの書き込み/読み取りを同期させる必要はありますか?

SerialPortインスタンスへのアクセスを同期させる必要がある場合は、読み書きが同時に起こらないようにするために、私は不思議に思っていました。私の良心は、私はこれらの呼び出しの周りにロックを置く必要があると私に言いますが、私はインターネットで見つけたすべてのC#SerialPortの例はまったくロックを使用しないので困惑しています。

+2

絶対にロックする必要があります。ほとんどの場合、インターネット上で見つかった例はあまり単純化されていません。私は、このようなものが省略された場合に備えて、私が従おうとしているすべての例について、ドキュメントを注意深く読むことをルールにしようとしています。 –

答えて

9

ここでは、参加SERIALPORTクラスの著者で、トピックに関する素晴らしいスレッドです:私は、

MSDN: How does SerialPort handle DataReceived?

を私の経験から、私は、ハードウェアシミュレータとして使用するためのダースシリアル通信アプリケーションを書いていますロックしないでください。当時は私が安全かどうかはわかりませんでしたが、実際にはまだ間違いはありませんでした。 (20人以上のテスターと自動テスト機が常時使用している年)つまり、私のアプリケーションは会社を離れることはないと言いました。

+1

優れた情報のおかげで、ありがとうございました。しかし、元の質問のような意思決定を行う際には、こうした実装の詳細にあまり依存しないように注意する必要があります。フードの中でどのように動作するかを正確に知ることは面白くて良いですが、それが正式に文書化されていないとすれば、それがそのままそのままになるという保証はありません。ドキュメント(とベストプラクティス)は、ロックすることをお勧めします。そうしないと、特定の*欠点*がない限り、私は何をしますか? –

+0

うわー、そのリンクは確かにいくつかの質問に答える!クラスで同じメンバー参照を使用してシリアルポートを閉じたり再接続したりするなどのシナリオを処理する必要があるため、ロックを使用します – Mike

2

ドキュメントから:

(Visual BasicではShared)すべてのパブリックstaticこのタイプ(SERIALPORT)のメンバーは、スレッドセーフです。どのインスタンスメンバーもスレッドセーフであるとは限りません。

したがって、読込み/書込みを確実に同期化する必要があります。

+1

はい私は言葉遣いを知っています。そのため、私は最初にこれらの通話を同期させるつもりでした。 – Mike

関連する問題