当社は、シリアルポートの通信のためのフォローのC#のコードを持っているの大多数蓄積:シリアルポートの通信が実行中のスレッド
ProcCntrlSSPort = new SerialPort(portNumber, 115200, Parity.None, 8, StopBits.One);
ProcCntrlSSPort.Handshake = Handshake.None;
ProcCntrlSSPort.ReadTimeout = 10;
ProcCntrlSSPort.ReadBufferSize = 32768;
ProcCntrlSSPort.DataReceived += ProcCntrlSSPortDataReceived;
//ProcCntrlSSPort.DataReceived += new SerialDataReceivedEventHandler(ProcCntrlSSPortDataReceived);
ProcCntrlSSPort.ReceivedBytesThreshold = 1;
try
{
ProcCntrlSSPort.Open();
ProcCntrlSSPort.DiscardInBuffer();
}
100msec毎に、当社のアプリケーションで受信したステータスメッセージがあります。私はSerialPort
がReceivedBytesThreshold
バイト数を受け取ったときに、SerialPort
によってイベントが発生することを理解しています。 ReceivedBytesThreshold
には1を使用する必要があります。なぜなら、重要なデータの1つがそのバイトが利用可能なときは常に1バイトずつ送られるからです。
イベントがSerialPortによって発生し、受信者によって処理されると、そのイベントは破棄され、そのイベントに関連付けられたスレッドは次回の使用に使用できるようになります。実行中のスレッドの蓄積が大量にあってはいけません。
しかし、実行中のスレッドは、一晩後に20スレッドから400スレッド以上に連続的に増加することがわかりました。ちょうどステータスメッセージがアプリケーションに送信され、他のアクティビティは送信されません。 私はすべてのプロセスコードを無効にしていますので、蓄積されたスレッドは私たちのコードからではないと確信しています。つまり、テスト目的で受け取ったデータには何もしません。
ReceivedBytesThreshold
をテスト用に128と増やしました。それは蓄積を遅くしますが、スレッド数は依然としてゆっくりと上がります。なぜ.netフレームワークがスレッドを正しく処理できないのですか?または私はそれを正しく使用しませんでしたか?
Ummmm。スマート・アレッキーは聞こえませんが、.NET Frameworkではトレッドを正しく処理することができません。開発者の責任です。シリアルポート経由で1日に何千ものクーポンを処理するスキャンアプリケーションがあり、問題はありません。 .NETとのシリアルポート通信を適切に調査して、何をしているのか、何が起こっているのかを理解しましたか?スレッディングは複雑で、交通規則を学ぶことなく大都市で車を安全に走らせることができると考えている以上に、それを理解することなくそれをやることは期待できません。 – David
あなたは 'ProcCntrlSSPortDataReceived'関数でスレッドを作成すると言っていますか?あなたはそこで何をしているのですか?おそらく、スレッドを作成する場所が問題です。 – SwDevMan81
シリアルポートを処理するために独自のスレッドを使用しませんでした。つまり、.NetのSerialPortクラスは、シリアルポートを扱うスレッドを作成すると思います。 – 5YrsLaterDBA