我有一个 WPF 应用程序,用户在某些文本框中输入数据库信息。一旦用户单击“连接”,就会根据用户输入的内容创建连接字符串并建立连接。我注意到如果用户输入任何错误的信息,应用程序将挂起,直到连接超时。通过挂起,我的意思是用户根本无法与应用程序的其余部分进行交互。
我的目标是在测试连接字符串时保持应用程序响应。
我认为将此工作流程放在不同的线程上是一个很好的解决方案。我的想法是在线程运行时禁用任何可能需要数据库连接的东西。一旦线程返回(并已确认连接字符串有效),我将重新启用所有内容。否则,请禁用所有内容。
但是,Thread
当线程完成时,该类没有事件通知(或者至少我不知道)。
我也和BackgroundWorker
班一起工作过。这效果更好。但是,当RunWorkerCompletedEventHandler
事件被触发并且连接字符串无效时,我得到以下异常:
调用线程无法访问此对象,因为不同的线程拥有它。
这可能是因为触发完成的事件处理程序时连接仍未超时。
有没有人有任何想法,或者我不应该尝试多线程连接到数据库?
我正在做的代码大纲:
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);
}
}