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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточная работа с БД(EF) 
:(
    Опции темы
kiler4747
Дата 12.5.2013, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хочу узнать как правильно работать с БД(EF) в моногопоточном приложении.
Делал так: при добавлении/удалении/обновлении создается новый поток, в этом потоке создается контекст и происходит изменение БД, затем через событие обновляется интерфейс:
Код

void UpdateViewSource()
        {
            Dispatcher.Invoke( new Action(delegate()
                {
                                        using (var context = new NewsContext())
                        {
                                  chanalsViewSource.Source = context.Channels.Include("Articls").ToList();
                           }
                }));
            
        }

что приводит к зависанию интерфейса, а при большом количестве операций требуется большое количество памяти.
PM MAIL Skype   Вверх
jonie
Дата 20.6.2013, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Цитата(kiler4747 @  12.5.2013,  01:42 Найти цитируемый пост)

что приводит к зависанию интерфейса, а при большом количестве операций требуется большое количество памяти. 

при большой нагрузке на диспатчер он будет ставить запросы в очередь-  "превеД" - всё подвиснет. Обычно не требуется подобное поведение (если, конечно, вы не DDoS-ите базу). Обновляйте UI не на каждый чих, а, например, по таймеру - пользователь врядли увидит что-то в быстро меняющимся мире...

Кроме того: вы в UI потоке производите и вычитку данных, зачем?
код перепишите так:
Код

void UpdateViewSource()
        {
//some nonUI thread
                                        using (var context = new NewsContext()) var data = context.Channels.Include("Articls").ToList();
            Dispatcher.Invoke( new Action(delegate()
                {
                        {
                                  chanalsViewSource.Source = data; //UI thread
                           }
                }));
            
        }



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

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

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


 




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


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

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