SerialPort
クラスとThreadPool.QueueUserWorkItem
またはTask
のいずれかを使用して、C#.Net 4.0アプリケーションで興味深い問題が発生しました。.Netスレッド対ThreadPortool対SerialPort通信のタスク
2つ以上のSerialPortsを同時に使用する場合にのみ問題が発生します。各シリアルポートは、私は3つの方法の1で作成した独自のスレッドで実行されます:問題を説明するために
new Thread(DoSerialCommX)
ThreadPool.QueueUserWorkItem(DoSerialCommX)
new Task(DoSerialCommX, TaskCreationOptions.LongRunning).Start()
、私は読んで私のDoSerialCommX
メソッドを作成しましたシリアルポートへの書き込みは永久にループします。これは次のように見えます:(実際のプログラムでは実際にこれをやっているわけではありませんが、問題を特定して説明するテストプログラムのスニペットです)。
方法2または3のいずれかを使用すると、シリアル通信が途切れ、多くの通信タイムアウトが発生します。方法1を使用すると、すべてが良好です。また、これは私のIntel AtomベースのPCでのみ発生すると言えます。デスクトップPCに問題はないようです。
私はスレッドプールがスレッドを再利用することを知っており、デフォルトではTask
はスレッドプールを使用します。スレッドプールは実際に短命の操作を意図していることがわかりました。しかし、私はを使ってみましたが、これはスレッドプールを使用するのではなく、専用のスレッドを生成すると思っていましたが、それでも動作しませんでした。
質問:なぜこのような状況でThread
が特別なのですか? Thread
にはIO操作に適していますか?
編集: 答えはこれまでのところ、私は決して終わることのないプロセスのためのThreadPoolやタスクを使用しようとしていますことを前提としているようです。私の実際のアプリケーションでは、そうではありません。私は問題を説明するために上のコードで終わりのないループを使用しています。私は実際にThread
がなぜ働き、ThreadPool
とTask
でないのかを知る必要があります。シリアル通信が問題になる原因とは、技術的にどのような違いがありますか?
私はそれが愚かな質問だと思うが、あなたは> 25スレッドを管理しようとしていないのですか? – Jeff
@ JeffN825、いいえ、シリアルポートあたり1つのスレッドしかなく、最大4つのシリアルポートを使用しています。 – Verax
1および3は同じである。 –