Хороший способ объединить параллельные события - PullRequest
0 голосов
/ 29 марта 2011

У меня есть приложение на C #, где я получаю события обновления из своего хранилища базы данных для каждого обновления в базе данных. Когда над базой данных выполняются большие операции, запускается несколько событий, и я хочу обновить GUI приложения при получении этих событий, но обновление GUI для каждого обновления не совсем оптимально.

Что является хорошим способом «объединять» события и реагировать только тогда, когда больше событий не поступает, моей первой идеей было использовать таймер с короткой продолжительностью и сбрасывать его для каждого нового полученного события, но это кажется немного неуклюжим , Есть ли лучший / более быстрый / простой способ решения этой проблемы?

Я бы предпочел не иметь видимых задержек во время обычных обновлений.

Ответы [ 4 ]

1 голос
/ 29 марта 2011

Создайте отдельный Thread, который ожидает на ManualResetEvent. Используйте Queue<DbEvent> для постановки в очередь новых событий. Подайте сигнал ManualResetEvent при получении нового события в БД.

Не забывайте блокировать очередь каждый раз, когда вы удаляете или ставите в очередь элементы.

Таким образом, вы можете добавлять новые события БД из нескольких потоков и при этом получать надлежащую обработку по одному событию за раз.

1 голос
/ 29 марта 2011

Возможно, вы сможете рассмотреть Reactive Framwework.

Как регулировать поток событий с помощью RX?

1 голос
/ 29 марта 2011

Я думаю, что твой путь - это путь.Я бы написал что-то вроде EventAggregator с таймером.Этот таймер запускается при поступлении первого события и сбрасывается каждый раз, когда в течение времени ожидания появляется новое событие.Если время ожидания достигнуто, оно вызовет свое собственное событие.

Но это также приводит к некоторой задержке, когда у вас есть только одно событие.Так что будьте уверены, где вы хотите такое поведение.Также убедитесь, что вы запускаете асинхронное событие в нужном потоке, иначе вы столкнетесь с исключением Cross-thread.Может быть, статья Реализация статьи Асинхронный шаблон на основе событий может дать вам несколько советов по этому вопросу.Также взгляните на эту статью Timer , чтобы выбрать правильный класс таймера для вашей цели.

0 голосов
/ 29 марта 2011

На мой взгляд, хорошим подходом будет:

Когда база данных обновляется, не делайте обновления на парня сразу, подождите короткий, но определенный период, чтобы увидеть, есть ли еще какие-либо обновления в базеПосле того, как период истек, вы должны зафиксировать обновления в графическом интерфейсе.Тогда ваш графический интерфейс не будет обновляться в режиме реального времени, но я думаю, что несколько секунд не такая уж большая проблема (в зависимости от использования API). Приятно то, что вам не нужно обновлять графический интерфейс при каждом обновлении базы данных.событие.

Надеюсь, это поможет вам.

Приветствия Влад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...