タイマーによるデータベースのポーリング

[ad_1]

MySQL データベースに継続的にリアルタイムでアクセスする必要があるアプリケーションを C# で作成しています。 現在、タイマーを使用してミリ秒ごとにデータベースをポーリングしています。

私はこれがこれを行うための最も効率的な方法ではないと(おそらく正しく)推測しています…誰かがこれに関する「正しい」方法、または少なくともより効率的な方法を教えてもらえますか?

前もって感謝します、
-ディー

解決策 1

タイマーを使用している場合、問題が 1 つあります。ポーリング時間がタイマー期間よりも長くなることがあります。 別のタイマーティックがコールバックまたはイベントハンドラーを呼び出したときにポーリングが不完全な場合はどうすればよいでしょうか?

データベースを常に周期的にポーリングするスレッドを作成します。 ここで、次の 2 つのことを行うことができます。1) を使用してサイクルに遅延を追加します。 System.Threading.Thread.Sleep; 2) でスレッドサイクルの実行を抑制します EventWaitHandle そして電話する EventWaitHandle.Set タイマー イベント ハンドルから。 どちらの方法も、スレッドが待機状態またはスリープ状態にあるときに CPU 時間を無駄にしません。OS はスレッドをオフに切り替え、有効期限 (または Thread.Abort)。

私はもう少し洗練された 2 番目の方法を好みます。 より良いタイミングを提供します。 ポーリング時間がタイマー期間よりも短い場合、ポーリングはタイマーの期間で発生し、この期間がポーリングに十分でない場合、プロセスはポーリングを継続するため、単に遅くなります (とにかく速くすることはできません。ポーリング時間は、クエリ、現在のデータ、およびランダムな要因を含むその他の要因によって異なります)。 この場合、冗長なタイマー イベントはすべて無視されます。

この目的のために、クラスを使用できます System.Threading.AutoResetEvent. ポーリング スレッドがメソッドを呼び出します WaitOne このクラスのインスタンス、およびタイマー呼び出し Set 同じインスタンスの。

見る:
http://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle.aspx[^]、
http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx[^]、
http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx[^].

[EDIT]

フォローアップの質問を見た後、別の提案: スレッド、タイマー、およびイベント待機ハンドルは、過去の解決策で説明したいくつかの理由により、スレッド ラッパーにカプセル化する必要があります。

ref パラメータをスレッドに渡す方法[^]、
開始後にスレッド (プロデューサー) のパラメーターを変更する[^].

-SA

解決策 2

探しているものがわかっている場合は、http://www.devart.com/dotconnect/mysql/docs/Devart.Data.MySql~Devart.Data.MySql.MySqlDependency.html を使用できます。

これはあなたのためにポーリングを行うことができます.

乾杯アディ。

[ad_2]

Source link

コメント

タイトルとURLをコピーしました