2012-01-11 6 views
0

1〜1/10Hzの周波数で定期的に監視したいデバイスにシリアル接続しています(未定)。アシンクロナスシリアル通信スレッドオプション

私は通信がノンブロッキングであることを望みます。したがって、何らかの種類のスレッドに通信を置き、メインアプリケーションにスレッドから発生したイベントを介してデータを受信させることにしました。

私は、アプリケーションの開始時に連続してデータを送受信するスレッドを作ることを考えていました。スレッドは、デバイスに送信するコマンドを含むキューを空にし、応答が完了したときにイベントを発生させるレスポンスを待ち受けます。 スレッドは、コマンドがキューにないときはスリープ状態になり、コマンドがキューに入るときはスリープ状態になります。

これは良い方法ですか? BackgroundWorkerやTaskなどのフレームワークのいくつかの確立された機能を使用していると考えていました。 おそらくこれを達成するための他のより良い方法がありますか?

答えて

1

これはスレッドのような高価なリソースを消費することを正当化するのに十分ではありません。代わりに、System.Timers.TimerまたはSystem.Threading.Timer(より良い)を使用してください。コールバックにデバイスクエリコマンドを書き込みます。 SerialPort.DataReceivedイベントを使用して応答を受信し、イベントを発生させます。今ではすべてが安価なスレッドプールスレッドで実行されます。

+0

ありがとうございました。最も素晴らしい! – kasperhj