Разрабатываю windows-сервис. Он должен при помощи SqlDependency отслеживать изменения в базе MSSql (добавление данных) и отправлять появившиеся данные серверу посредством SignalR. Поскольку обе технологии для меня новые, в голове полная каша. Прошу покритиковать меня и, возможно, подсказать более рациональный путь. Пока что выглядит это так: Сервис при старте создает новый поток, в котором будут происходить основные действия:
protected override void OnStart(string[] args)
{
Thread thread = new Thread(new ThreadStart(Dispatch));
thread.Start();
}
Метод Dispatch должен:
1) Подключиться к серверному хабу. Учитываем, что сервер, возможно, не будет доступен - при этом возникнет исключение. Если поймали исключение, ждем некоторое время и опять делаем попытку подключиться. И так до бесконечности.
2) Запросить дату и время, которой датирована последняя известная серверу запись (например, сообщение чата). Если поймали исключение (сервер внезапно отвалился), ждем некоторое время и переходим к пункту 1.
3) Выбрать из локальной базы записи, начиная с даты, возвращенной с сервера.
а) Если такие данные есть, передаем их поочередно на сервер, обновляя при этом переменную с датой. Если в какой-то момент сервер вернул исключение, возвращаемся к пункту 1.
б) Если таких данных нет (или были, но мы их все только что передали на сервер в пункте а), привязываемся к событию OnChange экземпляра класса SqlDependency и ждем появления.
Я вижу структуру кода метода Dispatch примерно следующей:
void Dispatch()
{
DateTime ServerDate;
while(true)
{
try
{
ConnectedToServerHub();
ServerDate=GetServerDate();
GetNewRecordAndDistatch(ServerDate);
}
catch
{
}
Thread.Sleep(1000);
}
}
В методе GetNewRecordAndDistatch(DateTime ServerDate) происходит выборка данных и отправка:
void GetNewRecordAndDistatch(DateTime ServerDate)
{
List<Record> records=GetNewRecordFromDB(ServerDate);
while (records.Count>0)
{
StartDispatch(records);//при успешной отправке где-то здесь обновляется дата ServerDate
records=GetRecordFromDB(ServerDate);
}
CreateDependency(ServerDate);
}
В методе CreateDependency(DateTime ServerDate) создается экземпляр класса SqlDependency и к нему привязывается событие:
...
SqlDependency dependency=new SqlDependency (command);
dependency.OnChange+=new OnChangeEventHandler(dependency_OnChange);
...
В обработчике события dependency_OnChange вызывается метод на отправку данных и опять ждем прихода данных:
void dependency_OnChange(...)
{
GetNewRecordAndDistatch(ServerDate);
}
Проблемы:
1) Я понимаю, что как только отработает GetNewRecordAndDistatch(ServerDate); в Dispatch(){}, пойдет следующая итерация цикла while(true){}, а мне надо, чтобы на следующую итерацию был переход только в результате исключения
2) Меня смущает, что в методе CreateDependency(DateTime ServerDate) привязывается событие, а из события опять вызывается метод. Ведь это приведет к бесконечном увеличению подписчиков на событие, верно? Как от этого избавиться, мне непонятно
3) Не нравится, что везде за собой надо таскать дату, но как без нее отслеживать именно новые данные, а не выгребать все подряд?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
В первом случае (закомментированом) все нормально работает, но когда пытаюсь присвоить переменной onReady функцию через сеттер, то в setTimeout пишет...
Функция считает сколько раз нужно умножить цифры числа друг на друга чтобы получить одну цифруВсё работает, но возвращаемая переменная в console
Всем привет! Помогите пожалуйста разобратьсяПри запуске js файла в консоли возникают следующие ошибки (jsdom 11