У меня есть синхронный метод, который вызывает метод, который собирает кучу данных в пользовательском объекте и сохраняет их в записи таблицы в базе данных Firebird, расположенной на сервере.
На сервере процесс мониторинга продолжает наблюдать за первой таблицей новых записей, используя событие базы данных (триггер таблицы вызывает событие, которое фиксируется монитором).Когда возникает это событие, эти данные отправляются сторонней службе черного ящика для обработки с использованием проприетарной библиотеки, для ответа на которую требуется от почти нуля до 1 минуты.
Сторонняя служба отвечает некоторыми данными, которые заносятся во вторую таблицу базы данных.Эта вторая таблица имеет другой триггер, который контролирует клиентская программа.Клиентская программа должна либо дождаться, пока сторонняя сторона ответит на некоторые данные, либо истечет время ожидания (те же 1 минуты).
В настоящее время я углубляюсь в мир событий базы данных и зашел в тупик:
В настоящее время у меня есть нажатие клавиши, которое запускает синхронный метод, который в соответствии с настройкой приложения запускает другой синхронный метод, который работает безупречно, или другой метод, который вставляет запись в базу данных Firebird.Эта база данных контролируется другим процессом, который читает эту запись, выполняет некоторые действия и вставляет новые данные в другую таблицу.
Возвращаясь к основной программе, у меня есть метод обработки событий, который запускается при вставке новых данных.Однако, поскольку это событие, остальная часть метода завершает свой курс, преждевременно заканчиваясь, прежде чем обработчик событий сможет прочитать новые данные.
В псевдокоде:
MainWindow_KeyDown(object sender, EventArgs e)
{
if (e.Key == X)
{
MakeADecision()
}
}
MakeADecision()
{
if (Properties.Settings.Default.MySetting) Console.Write(DoLocalStuff());
else Console.Write(DoRemoteStuff());
}
string DoRemoteStuff()
{
using (OldDataTableAdapter)
using (NewDataTableAdapter)
{
OldDataTableAdapter.Insert(OldData);
var revent = new FBRemoteEvent(MyConnectionString);
revent.RemoteEventCounts += (sender, e) =>
{
NewDataTableAdapter.Fill(NewDataDataTable);
NewData = NewDataDataTable[0].MYCOLUMN;
};
revent.QueueEvents("MY_FB_EVENT");
}
return NewData;
}
Как видите, проблема здесь в том, что DoRemoteStuff
достигает своего возврата до того, как событие может быть запущено.Я попытался превратить DoRemoteStuff()
в асинхронный метод, но я не знаю, как использовать события с асинхронными методами.Может кто-нибудь помочь мне с этим?Какие-либо советы или подсказки о том, как работать с асинхронными методами?