2010-10-04 4 views
4

Недавно наше приложение WPF/Entity Framework 4.0 стало неустойчивым после того, как мы начали использовать фоновых работников для загрузки данных из объекта. Мы делали это для того, чтобы графический режим «Please Wait'-spinner» работал, пока работник BG извлекал данные из базы данных, но мы начали испытывать многочисленные проблемы с подключением к EF и другие необъяснимые ошибки в случайные моменты времени. Сообщение от члена команды Microsoft EF показало, что EF не «потокобезопасен», и как только мы удалили рабочих BG, проблемы действительно исчезли.WPF «Пожалуйста, подождите» с использованием фоновых работников - возможно ли это?

Это оставляет нам проблему с интерфейсом UI - у нас больше нет удобного пользовательского счетчика «Пожалуйста, подождите», пока данные загружаются. Кто-нибудь есть какие-либо предложения относительно других способов, которыми это можно сделать, не помещая загрузку данных в работника BG?

Благодаря

ответ

5

Вы можете взять шаг между ними. Вместо BackgroundWorker создайте единственный поток, который будет работать до закрытия вашего приложения. Этот поток создает ваши соединения и обрабатывает всю связь с базой данных. Отправляйте сообщения на него, выполняйте ли они работу, а затем получайте результаты. Он освободит пользовательский интерфейс, одновременно предотвратив одновременное использование нескольких потоков.

+0

Нам нравится эта идея и будет исследовать ее возможности для нашей следующей версии. На данный момент мы используем простой вызов Dispatcher.Invoke, который заставляет пользовательский интерфейс обновляться с графикой «загрузки» непосредственно перед вызовом нашего db. Тем не менее, это было бы ncie, если бы Microsoft предоставила EF некоторую асинхронную функциональность. – Gatmando

1

Раньше я использовал BackgroundWorkers, и они действительно предназначены для выполнения задачи, делегированной им в фоновом режиме, создания событий, связанных с заданием, и умирания по завершении. Наиболее распространенным примером будет обновление полосы выполнения из фонового потока. Элементы пользовательского интерфейса могут обновляться только из потока пользовательского интерфейса, поэтому BackgroundWorkers, которые создают события в потоке пользовательского интерфейса, желательны по этой причине.

Имея BackgroundWorker делать что-то, что требует настойчивости, как операции над соединением с базой данных, похоже, что это вызовет проблемы исключительно из-за их временного характера.

 Смежные вопросы

  • Нет связанных вопросов^_^