2013-09-20 2 views
0

У меня есть следующий код для открытия базы данных SQLite. Все работает потрясающе, когда я пытаюсь открыть его без фонового работника. Проблема в том, что он загружает большое количество данных, поэтому я хочу бросить его на задний план.База данных SQLite при использовании BackgroundWorker C#

_worker = new BackgroundWorker(); 
_worker.DoWork += ((s, x) => 
{ 
    _citiesList = new ObservableCollection<City>(); 
    _citiesList = (Application.Current as App).db.SelectCityCollectionCollection(selectString); 
}); 
_worker.RunWorkerCompleted += ((s, x) => 
{ 
    LocationClearText.Visibility = Visibility.Visible; 
    SearchCityPromptList.ItemsSource = _citiesList.Select(p => p).Where(p => p.cityName.StartsWith(CitySearchBox.Text) || p.flatCityName.StartsWith(CitySearchBox.Text)).Take(30); 
}); 
_worker.RunWorkerAsync(); 

Ошибка, которую выбрасывает, - «Не удалось открыть файл базы данных: myDatabase.sqlite».

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

+0

Где вы хранения '_citiesList'? Вы должны использовать результат «BackgroundWorker». – CodingIntrigue

+0

_citiesList - это просто список

+0

Да, но точка «BackgroundWorker» заключается в том, что вам не нужно использовать статическую переменную. верните свой «Список <>» из метода «DoWork» и получите доступ к нему в «RunWorkerCompleted» с помощью 's.Result' - на данный момент существует вероятность, что ваш SQL-вызов будет перечисляться в вашем завершенном методе – CodingIntrigue

ответ

0

Я знаю, что это немного старо, но это первый хит в Google.

Лучше всего делать в этом случае является ..

lock(connection) 
{ 
    connection.open(); 
    DoStuff(connection); 
} 

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

Здесь больше читать о том, как замки работают и должны быть использованы в прорастающих ситуациях: https://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx

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