C# / Oracle SQL - 使用 BackgroundWorker 连接数据库

C# / Oracle SQL - using BackgroundWorker to connect with database

我的数据库连接有另一个问题。我正在使用 Oracle 的 ManagedDataAccess 客户端(来自 NuGet)。我创建了一些带有标签和进度条的表单来显示该程序正在与数据库连接。它只包含来自设计师的 2 个元素,所以我不会关注它。我也不关心效果。

我想在后台连接 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() 方法会像它应该的那样工作吗?

还有,我的'Connecting'问题应该怎么办?我以前也是这样的,就是等Connecting阶段结束,但是用多线程就不行了,是吗?

哦,自己也试过做线,效果一样。也尝试传递 WaitHandles,但效果不佳。

感谢帮助!

如果您进行一些小的更改,例如在 RunWorkerCompleted 事件中关闭 Form,则可以使用您的 BackgroundWorker。你可以去掉 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;