![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
masterik |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 28.8.2006 Где: Остенд, Бельгия Репутация: нет Всего: нет |
Доброе вреся суток,
Задача следующая: Имеется форма с больщим количеством кнопок. При клике вызывается один и тот же обработчик, где работа выполняется в отдельном потоке, чтобы избежать задержек UI. В потоке идет чтение и запись в БД (SQLite). Необходимо синхронизировать все эти потоки, чтобы не было одновременного обращения к БД из разных потоков. Т.е. своего рода очередь операций доступа к БД, сгрупированных по потокам. Попытался реализовать это с помощью AutoResetEvent (В потоке: WaitOne, работа, Signal)... Но при быстрых кликах все равно несколько потоков пытаются получить доступ к БД одновременно... Как можно грамотно решить эту задачу? ЗЫ: .NET Compact Framework 3.5 |
|||
|
||||
vponomarov |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 11.8.2007 Где: Киев Репутация: 4 Всего: 12 |
masterik, можно использовать lock(this) в коде обработчика
|
|||
|
||||
masterik |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 28.8.2006 Где: Остенд, Бельгия Репутация: нет Всего: нет |
lock (someObject) решает проблему частично: проблема одновременного доступа к БД решена, но появляются небольшие задержки в UI если быстро кликать по разным кнопкам.
|
|||
|
||||
vponomarov |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 407 Регистрация: 11.8.2007 Где: Киев Репутация: 4 Всего: 12 |
masterik, ну придется идти на компромисс
![]() |
|||
|
||||
masterik |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 28.8.2006 Где: Остенд, Бельгия Репутация: нет Всего: нет |
К сожалению мой шеф никак не может понять что наладонники не имеют таких мощных процессоров и видеокарт как их старшие братья....
|
|||
|
||||
Dennnis |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 23.3.2008 Репутация: нет Всего: 4 |
Можно воспльзоваться очередью Queue<T>.
ManualResetEvent asyncEvent = new ManualResetEvent(); В обработчике в очередь добавляем событие: lock(locker) {queue.Enqueue(obj); asyncEvent.Set(); }. В потоке считываем событие:
Мне кажется так должно вкатить --------------------
Get Rich or Die Tryin' |
|||
|
||||
masterik |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 28.8.2006 Где: Остенд, Бельгия Репутация: нет Всего: нет |
Инересное решение Dennnis. Как раз подходит для моего потока отправки данных по сети.
Что касается моей проблемы, то вроде бы добился более менее требуемого результата... Задержки похоже появляются при быстром открытии потоков друг за другом... Форма перерисовывается только после открытия всех потоков! Использую BackgroundWorker из SDF 2.2. |
|||
|
||||
Dennnis |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 23.3.2008 Репутация: нет Всего: 4 |
--------------------
Get Rich or Die Tryin' |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |