пятница, 27 марта 2009 г.

NPGSQL и Notification

Решил я прикрутить к одной проге, которая хранит данные в postgresql, систему обмена короткими сообщениями между пользователями.

Вроде бы все просто:
Делаем таблицу для хранения сообщений, пишем функции для отправки и получения, и через listen и notify организуем оповещения о поступлении сообщения. Серверная часть вроде заработала быстро, а вот с клиентом возникли затруднения.

В FormLoad написали:
NpgsqlCommand listener = new NpgsqlCommand("listen "+ username,this.npgsqlConnection1);
listener.ExecuteNonQuery();<
this.npgsqlConnection1.Notification += new NotificationEventHandler(npgsqlConnection1_Notification);


И в обработчике сообщения:
NpgsqlCommand getmes = new NpgsqlCommand("select _функция_забора_сообщения_();", this.npgsqlConnection1);
MessageBox.Show(getmes.ExecuteScalar().ToString(), "Срочное сообщение");


Сообщение получалось почему то далеко не всегда, не смотря на то, что соединение использовало SyncNotification, и при закрытии конекшена прога подвисала, при этом сам NPGSQL не вызывал никаких эксепшенов.

Немного порывшись в инете обнаружил какую то пространную фразу о thread'инге и переписал все так:
Thread thread_new = new Thread(delegate()
{
NpgsqlCommand getmes = new NpgsqlCommand("select _функция_забора_сообщения_();", this.npgsqlConnection1);
MessageBox.Show(getmes.ExecuteScalar().ToString(), "Срочное сообщение");
});
thread_new.Start();

После чего эксепшен отловлен и был.

Видимо, я снова что-то не дочитал в документации к NPGSQLю.