У меня есть приложение WPF, в котором пользователь вводит информацию о базе данных в некоторые текстовые поля. Как только пользователь нажимает «подключиться», создается строка подключения из того, что ввел пользователь, и устанавливается соединение. Я заметил, что если пользователь вводит неверную информацию, приложение зависает до тех пор, пока не истечет время соединения. Под зависанием я подразумеваю, что пользователь вообще не может взаимодействовать с остальной частью приложения.
Моя цель — сохранить отзывчивость приложения во время проверки строки подключения.
Я подумал, что размещение этого рабочего процесса в другом потоке — хорошее решение. Моя идея состоит в том, чтобы просто отключить все, что может потребовать подключения к базе данных во время работы потока. Как только поток вернется (и подтвердит, что строка подключения действительна ), я снова -включу все. В противном случае оставьте все отключенным.
Однако класс Thread
не имеет уведомления о событии, когда поток завершен (или, по крайней мере, я не знаю об одном ).
Я также работал с классом BackgroundWorker
. Это работает лучше. Однако, когда запускается событие RunWorkerCompletedEventHandler
и строка подключения недействительна, я получаю следующее исключение:
The calling thread cannot access this object because a different thread owns it.
Вероятно, это связано с тем, что время ожидания соединения еще не истекло, когда запущен обработчик завершенного события.
Есть ли у кого-нибудь какие-либо идеи, или я просто НЕ должен пытаться многопоточное соединение с базой данных?
Краткое описание того, что я делаю:
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
dbTool = new DBTool();
// Create the connection string
e.Result = dbTool.connectToDB(); // connectToDB() returns a bool (true if connection established)
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// connectToDB() returns a bool (true if connection established)
if(e.Result == true) // Trying to read e.Result here throws the exception
{
// e.Error and e.Cancel should be checked first
// However, I would like the thread to finish before
// this event is fired
}
if (e.Error != null)
{
Console.WriteLine(e.Error.Message);
}
}