Home > C# > PostgreSQL > Npgsql > ドキュメント

通知を待つ Npgsql

新規作成日 2019-03-05
最終更新日

Waiting for Notifications

備考:この機能は、Npgsql 3.0の "Continuous processing mode"に代わるものです。

PostgreSQLの非同期メッセージ

PostgreSQL Asynchronous messages

PostgreSQLには、任意の通知メッセージをクライアント間で送信できるという機能があります。例えば、あるクライアントは、実行することになっているタスクの他のクライアントによって、それが、知らされるまで、待つかもしれません。通知は、その性質上、非同期です。-それらは、いつでも到着することができます。この機能の詳細については、PostgreSQLのNOTIFYコマンドを参照してください。いくつかの他の非同期のメッセージ型(例えば、差し迫ったデータベース・シャットダウン)そして、パラメータ変化が、通知されます。詳細については、PostgreSQLプロトコルのドキュメントを参照してください。

"asynchronous"という言葉にもかかわらず、このページは、ADO.NETの非同期操作(ExecuteReaderAsyncなど)とは関係ないことに注意してください。

通知の処理

Processing of Notifications

Npgsqlは、NpgsqlConnectionのNotificationイベントを通して、通知メッセージを公開します。

非同期の通知は、めったに使用されないため、そして、処理は、複雑になる可能性があります。Npgsqlは、通常の(同期的な)問い合わせの相互作用の一部として通知メッセージを処理するだけです。すなわち、非同期の通知が、送信される場合、Npgsqlは、それを処理するだけです。そして、次にコマンドが、送信や処理されたときに、ユーザーにイベントを発行します。

同期の要求 - 応答サイクルの外側で通知を受け取るために、NpgsqlConnection.Wait()を呼び出します。一回の通知が受け取られるまで、これは、あなたのスレッドをブロックするでしょう。(タイムアウトによるバージョンと非同期バージョンが、存在する点に注意してください)。通知は、以前と同様に、Notificationイベントを介して配信されることに注意してください。

var conn = new NpgsqlConnection(ConnectionString);
conn.Open();
conn.Notification += (o, e) => Console.WriteLine("Received notification");

using (var cmd = new NpgsqlCommand("LISTEN channel_name", conn)) {
  cmd.ExecuteNonQuery();
}

while (true) {
  conn.Wait();   // Thread will block here
                                // ここでスレッドが、ブロックされます。
}

キープアライブ

Keepalive

キープアライブをオンにするといいかもしれません。

このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」