确保在后台工作程序上关闭数据库连接取消异步

时间:2015-09-30 02:02:37

标签: c# winforms visual-studio

到目前为止,我有一个运行后台工作程序的后台工作程序的代码:

if (backgroundWorker1.IsBusy == true)
{
    backgroundWorker1.CancelAsync();
}
else
{
    backgroundWorker1.RunWorkerAsync();
}

这会关闭背景工作者的联系吗?或者我是否需要为进度更改添加代码行?

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
            try
            {
                superset = new DataSet();
                connectionString = "Driver={IBM DB2 ODBC DRIVER}; Database=" + lines[i] + "; Hostname=" + lines[i] + "." + lines[i] + ".XXX; Port = XXXX; Protocol = TCPIP; Uid=XX; Pwd= XXXX;
            }
            connection = new OdbcConnection(connectionString);
            adapter = new OdbcDataAdapter(masterquery, connection);

            connection.Open();
            adapter.Fill(superset);
            superset.Merge(superset);
            connection.Close();
        }
    }
    dataGridView1.DataSource = superset;
    dataGridView1.DataSource = superset.Tables[0];
    //tabControl1.SelectedTab = tabPage3;
}

3 个答案:

答案 0 :(得分:2)

连接没有关闭,它会中止工作人员,但连接可能会卡在其中,

为什么不让它变得简单?只需致电

connection.Close();
connection.Dispose();

致电cancelAsync

答案 1 :(得分:0)

您的后台工作人员从不测试取消,因此始终运行完成并关闭连接。

但是,如果在连接打开时遇到Exception,则在垃圾回收之前不会关闭。我建议以下改进

using (var connection = new OdbcConnection(connectionString))
{
   var adapter = new OdbcDataAdapter(masterquery, connection);
   connection.Open();
   adapter.Fill(superset);
   superset.Merge(superset);
}

答案 2 :(得分:0)

请记住,在后台工作人员的情况下,您有责任在工人方法中检查取消请求(请参阅BackgroundWorker.CancellationPending)。如果您未在backgroundWorker1_DoWork内检查取消请求,则后台工作人员不会提前神奇地终止。由于取消的决定权在您的控制之下,因此只需确保工作方法在完成后关闭连接,无论是否完成,因为它完成了应该执行的操作或因为它已被取消。

在这种特殊情况下,您可能没有很多好处来检查取消请求(这与您在长循环中执行大量操作不同)。您可以在调用CancelAsync后调用connection.Close,但如果这样做,您必须明白取消请求将被忽略。可能是worker方法将在那时完成,但不是因为您请求取消,而是因为adapter.Fill可能因为您关闭连接而失败。

还有一些评论:

  • 如果调用connection.Dispose,则无需调用connection.Close。请参阅this stackoverflow问题。
  • 在backgroundWorker1_DoWork中,您应该使用“using”语句并放弃对connection.Close()的调用。像这样:

    using(connection = new OdbcConnection(connectionString) { ... }

    如果有例外,它会更安全。

  • 如果您打算使用cakncellation,则必须设置: backgroundWorker1.WorkerSupportsCancellation = true;
    否则CancelAsync将抛出异常。
  • 我不确定您是否可以从后台线程设置dataGridView1.DataSource。看看它是否有效,但您可能需要更改设置dataGridView1.DataSource
  • 的代码