Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Синхронизация потоков и UI


Автор: masterik 16.4.2008, 12:30
Доброе вреся суток,


Задача следующая:
Имеется форма с больщим количеством кнопок. При клике вызывается один и тот же обработчик, где работа выполняется в отдельном потоке, чтобы избежать задержек UI. В потоке идет чтение и запись в БД (SQLite). Необходимо синхронизировать все эти потоки, чтобы не было одновременного обращения к БД из разных потоков. Т.е. своего рода очередь операций доступа к БД, сгрупированных по потокам.

Попытался реализовать это с помощью AutoResetEvent (В потоке: WaitOne, работа, Signal)... Но при быстрых кликах все равно несколько потоков пытаются получить доступ к БД одновременно...


Как можно грамотно решить эту задачу?

ЗЫ: .NET Compact Framework 3.5

Автор: vponomarov 16.4.2008, 12:56
masterik, можно использовать lock(this) в коде обработчика

Автор: masterik 16.4.2008, 15:05
lock (someObject) решает проблему частично: проблема одновременного доступа к БД решена, но появляются небольшие задержки в UI если быстро кликать по разным кнопкам.

Автор: vponomarov 16.4.2008, 16:58
masterik, ну придется идти на компромисс smile тем более на мобильном устройстве пользователи это должны понять

Автор: masterik 17.4.2008, 13:17
К сожалению мой шеф никак не может понять что наладонники не имеют таких мощных процессоров и видеокарт как их старшие братья....

Автор: Dennnis 17.4.2008, 14:39
Можно воспльзоваться очередью Queue<T>.

ManualResetEvent asyncEvent = new ManualResetEvent();

В обработчике в очередь добавляем событие: lock(locker) {queue.Enqueue(obj); asyncEvent.Set(); }.
В потоке считываем событие: 
Код

while(true) 
{
   lock(locker)
   {
       asyncEvent.WaitOne();
       object obj = queue.Dequeue();
   }
   //Создаем новый поток для чтение и запись в БД
}


Мне кажется так должно вкатить

Автор: masterik 17.4.2008, 14:55
Инересное решение Dennnis. Как раз подходит для моего потока отправки данных по сети.

Что касается моей проблемы, то вроде бы добился более менее требуемого результата... Задержки похоже появляются при быстром открытии потоков друг за другом... Форма перерисовывается только после открытия всех потоков! Использую BackgroundWorker из http://opennetcf.com/Default.aspx?tabid=67.

Автор: Dennnis 17.4.2008, 15:07
Цитата(masterik @  17.4.2008,  14:55 Найти цитируемый пост)
Инересное решение Dennnis

Спасибо)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)