概要
原文
npgsqlマニュアル(2014年7月25日・13改訂版)(外部サイト)
公式ページのドキュメントです。英語で書かれています。
通知とその動作
Working with Notifications
Npgsqlは、ユーザーが、サーバから送信される通知に基づいて、イベントを受け取ることができます。 2つの方法が、Npgsqlでnoticationsを受け取るためにあります:非同期、あるいは、同期して。 同期通知は、Npgsql 1.0とそれ以降のみでサポートされています。
非同期通知
Asynchronous Notifications
これは、Npgsqlで使用される既定の通知の仕組みです。それは、非同期で呼び出されます。 なぜなら、Npgsqlは、イベントの実行時に、そのサーバで作成された通知を受け取りません。 Npgsqlは、サーバとクライアントの対話処理の、次のインスタンスで通知を受け取ります。 この対話処理は、実際に発生します。Npgsqlが、後に続くコマンドをサーバに送るとき、-それは、数秒から、数時間までで構成されるでしょう。 これを考慮して、ほとんどのユーザーは、適時、問題の通知受け取るために、積極的にサーバの意見を尋ねる必要があるでしょう。 一つの方法は、「;」のような、空のコマンドによって意見を尋ねることが必要です
同期通知
Synchronous Notifications
Npgsql1.0以降では、同期通知のためのサポートが存在します。 このモードで動作するとき、Npgsqlは、そのインスタンス生成とクライアントにそれを提供するために、通知を受け取ることができます。 これはすべて、クライアントとサーバの間で、どんな追加の対話処理もなしで行われます。(先に説明したように)。
重要なお知らせ:
同期通知を使用すると、あなたは、通知ハンドラ関数内でコマンドを実行することができません。 あなたが、それを行うと、あなたは、スレッドとしてNpgsqlを掛けるでしょう。それは、通知が同じものであるとして処理します。 それは、Npgsqlとバックエンドとの通信を処理します。 あなたが、どんなコマンドでも使用したい場合、どうぞ、他のコネクションを作成して、代わりにそれを使用してください。 これは、最も良い解決法でありません。しかし、私たちは、他の接続を必要としないで行うために、より優れた方法を学んでいます。
通知を受け取るためのコードは、両方のモードで同じものです。:
using System;
using System.Data;
using Npgsql;
using NpgsqlTypes;
using System.Threading;
public class c
{
public static void Main(String[] args)
{
var conn = new NpgsqlConnection("Server=127.0.0.1;User id=npgsql_tests;password=npgsql_tests;");
conn.Open();
NpgsqlCommand command = new NpgsqlCommand("listen notifytest;", conn);
command.ExecuteNonQuery();
conn.Notification += new NotificationEventHandler(NotificationSupportHelper);
command = new NpgsqlCommand("notify notifytest;", _conn);
command.ExecuteNonQuery();
Console.ReadLine(); // To prevent program termination before notification is handled.
} // プログラム終了を防止するために、事前に、通知を処理します。
private void NotificationSupportHelper(Object sender, NpgsqlNotificationEventArgs args)
{
// process notification here.
// ここに、通知処理があります。
}
}
このコードは、通知を聞き取り、通知を発生させるために登録します。 それは、NotificationSupportHelperメソッドに提供されるでしょう。