后台人员虽然不工作但很忙

问题描述 投票:0回答:1

我在桌面应用程序表单中使用 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,它在我的项目的所有部分都运行得很好,但这里我不知道问题是什么!

c# .net backgroundworker
1个回答
0
投票

为什么你认为可以取消后台工作? (你永远不会使用backgroundWorker.CancellationPending或e.Cancel = true;。)

您必须等待 RunWorkerCompleted 才能重新启动它。在“已完成”中,您可以检查它是否被取消。 (如果您实施取消机制)。

据我所知 CancelAsync 不会阻塞并等待它完成(否则它将阻塞 UI 线程)

您可以通过设置一个 NextJob 变量(或队列)来解决此问题,该变量应在 Completed 事件上启动。

© www.soinside.com 2019 - 2024. All rights reserved.