SerialPort
クラスとThreadPool.QueueUserWorkItem
またはs Task
.
この問題は、2 つ以上の SerialPort を同時に使用した場合にのみ発生します。各シリアル ポートは、次の 3 つの方法のいずれかで作成した独自のスレッドで実行されます。
new Thread(DoSerialCommX)
ThreadPool.QueueUserWorkItem(DoSerialCommX)
new Task(DoSerialCommX, TaskCreationOptions.LongRunning).Start()
この問題を説明するためDoSerialCommX
に、ループ内でシリアル ポートの読み取りと書き込みを永続的に行うメソッドを作成しました。次のようになります: (実際のプログラムで実際にこれを行っているわけではありません。これは、問題を切り分けて説明するテスト プログラムからの抜粋です)。
private void DoSerialCommX()
{
SerialPort port = new SerialPort("ComX", 9600);
port.Open();
while(true)
{
//Read and write to serial port
}
}
方法 2 または 3 を使用すると、シリアル通信が途切れ、多くの通信タイムアウトが発生します。方法 1 を使用すれば、すべて問題ありません。また、これは Intel Atom ベースの PC でのみ発生するようです。デスクトップPCは問題ないようです。
スレッド プールがスレッドを再利用し、デフォルトでスレッド プールを使用することは知っていTask
ます。そして、スレッドプールが実際には短期間の操作を意図していることを私は知っています。しかしTaskCreationOptions.LongRunning
、スレッドプールを使用するのではなく、専用のスレッドを生成すると思われる を使用してみましたが、それでも機能しませんでした。
質問:Thread
この状況で特別な 理由は何ですか? Thread
IO操作により適したものにする何かがありますか?
編集:
これまでの回答は、終わりのないプロセスに ThreadPool または Tasks を使用しようとしていると仮定しているようです。私の実際のアプリケーションでは、これは当てはまりません。問題を説明するために、上記のコードで終わりのないループを使用しているだけです。なぜThread
機能しThreadPool
、Task
機能しないのかを本当に知る必要があります。シリアル通信がしゃっくりする原因となる技術的な違いは何ですか?