備考:この機能は、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
キープアライブをオンにするといいかもしれません。