RFIDを使用したC#スレッドに関する質問
-
29-10-2019 - |
質問
私の質問は、私が正しいアプローチを取っていることを確認し、スレッドを正しく処理することについてのフィードバックです。私は自分のスレッドのいくつかをセットする必要があると感じているので、すべてのフィードバックを歓迎します。
私が抱えている問題は、ゼロ以上のRFIDリーダーからRFIDタグを読むことです。問題なく1人の読者のために読むことができるので、いくつかの読み物は問題になりません。読者が読むタグの各タグまたはバッチは、.NETイベントによって配信されます。
私の計画は、読者、接続、開始、停止などを維持するReaderControlクラスをセットアップすることです。このクラスは tagread 読者からのイベント。各イベントでは(約250msごとに)処理されます。読み取りタグID(文字列)をハッシュセットにして、ハッシュセットはReaderControlにあります。 ReaderControlにはタイマーが含まれ、500msごとに発火/経過すると、このタイマーラップされたイベントはReaderControlによって処理され、これまでにすべてのリーダーから読み取りタグをパッケージ化し、 tagsread イベント。これの目的は、イベントの発砲を最小限に抑え、重複タグを削減することです。
tagsreads イベントは、TagTranslatorと呼ばれる別のクラスによって処理されます。このクラスは、タグID(文字列)をループし、タグが参照するもの、つまりiPersonオブジェクトを解決します。このクラスは、翻訳の完了時にイベントを発射します 人々 イベント。
人々 イベントは、GUI(MVPパターン)のモデルによって処理されます。全体的なアイデアは、GUIディスプレイがRFIDリーダーを通過する人々の名前を表示することです。ディスプレイは単純ですが、明らかにフードの下にありますタグはAsychで読み取られており、表示される「実際の」オブジェクトに翻訳されています。
ReaderControlは独自のスレッドで実行されるべきだと思いますか? GUIが何をしているかに関係なく、タグを読み続けるために、このクラスを独自のスレッドにパッケージ化するにはどうすればよいですか。また、イベントを処理するときにタグトランスレーターが翻訳を処理するためにスレッドを作成するときは、いつだと思いますか。
解決
イベントを使用するのではなく、同時キューデータ構造と複数の生産者単一の消費者モデルを使用することをお勧めします。タグリーダーはプロデューサーとして、処理スレッドを消費者として考えてください。
スレッドが読者からタグを受信すると、そのタグがキューに追加され、複製などを心配することはありません。ヘック、あなたはそうかもしれません 欲しいです ある時点でその複製情報。ここでそれを捨てる理由はありません。
消費者はキューで待機し、アイテムを脱いで一度に1つずつ処理します。
BlockingCollection
クラスはこれに最適です。
// Shared queue. Assuming that a tag is simply a string.
BlockingCollection<string> TagQueue = new BlockingCollection<string>();
// Tag reader threads (producers)
while (!ShutdownMessageReceived)
{
string tag = GetTagFromReader(); // however that's done
TagQueue.Add(tag);
}
// Processing thread (consumer)
while (!ShutdownMessageReceived)
{
string tag = TagQueue.Take();
// process the tag
}
BlockingCollection
複数の生産者と消費者をサポートするので、それぞれが好きなだけ多くを手に入れることができます。 Take
メソッドは、アイテムが利用可能になるまでブロックされます。それは勤勉ではないので、頭上の投票はありません。
この種のことは非常に簡単に実装できます BlockingCollection
, 、そして非常にうまく機能するクリーンでシンプルなコードを作成します。