2016-05-24 25 views
0

私のデータベース接続には別のトロブールがあります。私は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も渡そうとしましたが、うまくありませんでした。

ありがとうございました!

答えて

1

BackgroundWorkerは、RunWorkerCompletedイベントでFormを閉じるなどのマイナーな変更を加えれば使用できます。そして、あなたはManualResetEventを取り除くことができます。

ConnectingProgressBar pb = new ConnectingProgressBar(); 

BackgroundWorker bwConn = new BackgroundWorker(); 
bwConn.DoWork += (sender, e) => 
{ 
    db = new OracleConnection(defaultConnectionString); 
    db.Open(); 
}; 
bwConn.RunWorkerCompleted += (sender, e) => 
{ 
    if (e.Error != null) 
    { 
     // An exception was thrown, handle accordingly 
    } 

    pb.Close(); 
    pb.Dispose(); 
}; 
bwConn.RunWorkerAsync(); 

pb.ShowDialog(); 

return db.State; 
+0

私は、DBは(それが原因で非同期のとNullReferenceExceptionを投げた - それは、労働者がその作業を完了する前に句を返すように移動)がnullでないことを確認するManualResetEventを使用する必要がありました。 BackgroundWorkerの前にOracleConnectionオブジェクトを作成すると、状態はConnectionState.Closedとなります。 – Shuji

+0

あなたは何を言っているのか分かります。代わりにこれを試してください。 –

+0

それは魅力のように機能します!また、私はそのプログレスバーにShowDialog()を使用することについても考えなかった。ありがとうございました! – Shuji

関連する問題