我在桌面应用程序表单中使用 BackGrondWorker 从 Internet 加载一些数据,但我遇到了一个奇怪的问题。 加载表单后,我单击表单上名为“RdMain”的单选按钮,该按钮可触发 BGW:
private void RdMain_CheckedChanged(object sender, EventArgs e)
{
if (BgwCodeLevel.IsBusy)
{
BgwCodeLevel.CancelAsync();
}
xAccounts.xClsMain.ShowPB();
BgwCodeLevel.RunWorkerAsync();
}
所以它运行良好,但是当我单击另一个名为“RdSub”的单选按钮(其代码与“RdMain”完全相同)时,我收到错误消息 BGW 当前正忙,尽管实际上并不忙!
当你看到代码时,你会发现一切都好,至少我认为是这样。
private void BgwCodeLevel_DoWork(object sender, DoWorkEventArgs e)
{
try
{
//CheckConn
if (xAccounts.xClsDb.CheckConn() == false) { Settings.Default.ErrType = 1; return; }
//Get Code + Level
xAccounts.AccParent = Convert.ToInt64(CboAccParent.SelectedValue);
if (RdMain.Checked)
{
xAccounts.AccType = "main";
}
else
{
xAccounts.AccType = "sub";
}
xAccounts.Get_AccCode();
xAccounts.Get_AccLevel();
Settings.Default.ErrType = 0;
}
catch
{
Settings.Default.ErrType = 2;
}
finally
{
xAccounts.xClsDb.CloseConn();
}
}
//End
private void BgwCodeLevel_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
switch (Settings.Default.ErrType)
{
case 0:
TxtAccCode.Text = xAccounts.AccCode.ToString();
TxtAccLevel.Text = xAccounts.AccLevel.ToString();
xAccounts.xClsMain.HidePB();
break;
case 1:
xAccounts.xClsMain.Msg_ErrCon();
break;
case 2:
xAccounts.xClsMain.Msg_ErrOp();
break;
case 3:
xAccounts.xClsMain.Msg_ErrDbl();
break;
}
}
注意:这不是我第一次使用 BGW,它在我的项目的所有部分都运行得很好,但这里我不知道问题是什么!
为什么你认为可以取消后台工作? (你永远不会使用backgroundWorker.CancellationPending或e.Cancel = true;。)
您必须等待 RunWorkerCompleted 才能重新启动它。在“已完成”中,您可以检查它是否被取消。 (如果您实施取消机制)。
据我所知 CancelAsync 不会阻塞并等待它完成(否则它将阻塞 UI 线程)
您可以通过设置一个 NextJob 变量(或队列)来解决此问题,该变量应在 Completed 事件上启动。