ユーザーがいくつかのテキストボックスにデータベース情報を入力する 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);
}
}