Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация потоков и UI, .NET Compact Framework 
:(
    Опции темы
masterik
Дата 16.4.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 28.8.2006
Где: Остенд, Бельгия

Репутация: нет
Всего: нет



Доброе вреся суток,


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

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


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

ЗЫ: .NET Compact Framework 3.5
PM MAIL GTalk   Вверх
vponomarov
Дата 16.4.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 4
Всего: 12



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


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
masterik
Дата 16.4.2008, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 28.8.2006
Где: Остенд, Бельгия

Репутация: нет
Всего: нет



lock (someObject) решает проблему частично: проблема одновременного доступа к БД решена, но появляются небольшие задержки в UI если быстро кликать по разным кнопкам.
PM MAIL GTalk   Вверх
vponomarov
Дата 16.4.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 11.8.2007
Где: Киев

Репутация: 4
Всего: 12



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


--------------------
user posted image
user posted image
PM MAIL ICQ   Вверх
masterik
Дата 17.4.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 28.8.2006
Где: Остенд, Бельгия

Репутация: нет
Всего: нет



К сожалению мой шеф никак не может понять что наладонники не имеют таких мощных процессоров и видеокарт как их старшие братья....
PM MAIL GTalk   Вверх
Dennnis
Дата 17.4.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 23.3.2008

Репутация: нет
Всего: 4



Можно воспльзоваться очередью Queue<T>.

ManualResetEvent asyncEvent = new ManualResetEvent();

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

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


Мне кажется так должно вкатить
--------------------
Get Rich or Die Tryin'
PM   Вверх
masterik
Дата 17.4.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 28.8.2006
Где: Остенд, Бельгия

Репутация: нет
Всего: нет



Инересное решение Dennnis. Как раз подходит для моего потока отправки данных по сети.

Что касается моей проблемы, то вроде бы добился более менее требуемого результата... Задержки похоже появляются при быстром открытии потоков друг за другом... Форма перерисовывается только после открытия всех потоков! Использую BackgroundWorker из SDF 2.2.

PM MAIL GTalk   Вверх
Dennnis
Дата 17.4.2008, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 23.3.2008

Репутация: нет
Всего: 4



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

Спасибо)
--------------------
Get Rich or Die Tryin'
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0727 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.