私のデータベース接続には別のトロブールがあります。私はOracleのManagedDataAccessクライアント(NuGetから)を使用しています。プログラムがDBに接続していることを示すために、ラベルとプログレスバーを含むフォームを作成しました。それはデザイナーからの2つの要素だけを含んでいるので、私はそれに焦点を当てません。私はその影響についても気にしない。C#/ Oracle SQL - BackgroundWorkerを使用してデータベースに接続
Oracle DBにバックグラウンドで接続したいが、そのプログレスバーは動いている。
public ConnectionState Connect(string connectionString = defaultConnectionString)
{
//form that contains progress bar with Marquee style
ConnectingProgressBar pb = new ConnectingProgressBar();
pb.Show();
//background worker - to connect with DB
BackgroundWorker bwConn = new BackgroundWorker();
ManualResetEvent doneEvent = new ManualResetEvent(false);
bwConn.DoWork += (sender, e) =>
{
db = new OracleConnection(defaultConnectionString);
db.Open();
//while (db.State == ConnectionState.Connecting) Thread.Yield();
};
bwConn.RunWorkerCompleted += (sender, e) =>
{
doneEvent.Set();
};
bwConn.RunWorkerAsync();
doneEvent.WaitOne();
pb.Close();
pb.Dispose();
return db.State;
}
私のコードでは、私のような効果が得られません。それは初期化フォームの間に立ち往生しました - 私はフォームから応答がありませんでした、そして結局、データベースは接続しません。 OracleConnectionのOpenAsync()メソッドも試しましたが、違いはありません。
WaitOne()メソッドはそれと同じように動作しますか?
また、「接続中」の問題はどうすればよいですか?私はこのようにしていましたが、接続フェーズが完了するまで待つだけでしたが、マルチスレッドを使用するとそれはうまくいかないでしょうか?
ああ、自分でスレッドを作ってみたところ、同じ効果があった。 WaitHandlesも渡そうとしましたが、うまくありませんでした。
ありがとうございました!
私は、DBは(それが原因で非同期のとNullReferenceExceptionを投げた - それは、労働者がその作業を完了する前に句を返すように移動)がnullでないことを確認するManualResetEventを使用する必要がありました。 BackgroundWorkerの前にOracleConnectionオブジェクトを作成すると、状態はConnectionState.Closedとなります。 – Shuji
あなたは何を言っているのか分かります。代わりにこれを試してください。 –
それは魅力のように機能します!また、私はそのプログレスバーにShowDialog()を使用することについても考えなかった。ありがとうございました! – Shuji