到目前为止,我有一个运行后台工作程序的后台工作程序的代码:
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;
}
答案 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可能因为您关闭连接而失败。
还有一些评论:
在backgroundWorker1_DoWork中,您应该使用“using”语句并放弃对connection.Close()
的调用。像这样:
using(connection = new OdbcConnection(connectionString)
{
...
}
如果有例外,它会更安全。
backgroundWorker1.WorkerSupportsCancellation = true;
dataGridView1.DataSource
。看看它是否有效,但您可能需要更改设置dataGridView1.DataSource
。