Подключение к базе данных в другом потоке

У меня есть приложение 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);
    }
}
5
задан Chris Dargis 26 July 2012 в 14:12
поделиться