PCに特定のOracleデータベースを接続する可能性があるかどうかをテストする小さなユーティリティプログラムを作成しました。DBアクセスを行っているバックグラウンドスレッドがハングするUI
UIの応答性を維持し、進捗のステップを見るために、DBコードをバックグラウンドスレッドに配置します。私の驚きには、UIはまだハングアップしています(ただし、それほど多くはありません)。
このアプリは大したことではありませんが、スレッド内のDBコードがUIスレッドをハングアップするという一般的なケースが面白いと思いました。
private void bgwDataAccess_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bgw = sender as BackgroundWorker;
try
{
bgw.ReportProgress(0, "Starting...\r\n");
bgw.ReportProgress(0, "Active ConnectionString:\r\n");
bgw.ReportProgress(0, Settings.Default.ConnctionString + "\r\n\r\n");
OracleConnection con = new OracleConnection(Settings.Default.ConnctionString);
OracleCommand cmd = new OracleCommand("SELECT Count(*) FROM MYTABLE", con);
bgw.ReportProgress(0, "Opening db...\r\n");
con.Open();
bgw.ReportProgress(0, "Opened.\r\n\r\n");
bgw.ReportProgress(0, "Executing SQL-query...\r\n");
Object result = cmd.ExecuteScalar();
bgw.ReportProgress(0, String.Format("Result: {0}\r\n\r\n", result.ToString()));
con.Close();
}
catch (Exception)
{
throw;
}
}
private void bgwDataAccess_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
txtResult.Text += e.UserState;
}
あなたの問題を解決していない小さなメモは、キャッチを削除し、最後にtry-finallyを使用して接続を閉じます。 tryブロックがconオブジェクトを最終的に使用できるようにする前に、接続を宣言する必要があります(開かない)。 –
はい、あなたはそれについて絶対に正しいです! – kaze
「UIスレッドをハングする」を定義/記述できますか?これはどれくらい深刻ですか? –