【问题标题】:C# Backgroundworker w/ multiple parameters not cancelling带有多个参数的 C# Backgroundworker 不会取消
【发布时间】:2015-11-10 19:36:52
【问题描述】:

我正在使用具有多个参数的后台工作程序。 工人正在使用我的参数。 但我的问题是,我无法阻止后台工作人员。

....
BackgroundWorker workerGetAdvData;
workerGetAdvData = new BackgroundWorker();
workerGetAdvData.DoWork += new DoWorkEventHandler(getAdvData.request_DoWork);

workerGetAdvData.RunWorkerAsync(clsComSettingMain); 

........


class ClsGetAdvData
{
    //open Serial Port with settings from clsComSettings class
    byte[] adv_request = { 0xF0, 0x02, 0x0D };   //Command for requesting advanced sensor data from PFC

public void request_DoWork(object sender, DoWorkEventArgs e)
{
    ClsComSettingMain clsComSettingMain = (ClsComSettingMain)e.Argument;
    string comPort = clsComSettingMain.comport;
    int baudRate = clsComSettingMain.baudRate;

    if (comPort != null && baudRate != 0)
    {
        SerialPort serialPort = new SerialPort(comPort, baudRate);
        serialPort.Open();

        while (true)
        {
            if (e.Cancel)
            {
                e.Cancel = true;
                break;
            }
            else
            {
                serialPort.Write(adv_request, 0, 3); // Write byte array to serial port, with no offset, all 3 bytes
                Thread.Sleep(500);
            }
        }
    }

}

}

我正在尝试使用以下代码取消后台工作人员:

        private void MenuItem_Click_Serial_Stop(object sender, RoutedEventArgs e)
    {
        if (workerGetAdvData.IsBusy) //check if worker is running
        {
            workerGetAdvData.CancelAsync();
        }
    }

}

但是工人并没有停下来。由于我在工作人员中使用的参数而无法正常工作?

亲切的问候 巴斯蒂安

最好的问候

【问题讨论】:

    标签: c# .net multithreading backgroundworker cancellation


    【解决方案1】:

    在您的 DoWork 代码中,您应该像这样检查BackgroundWorker.CancellationPending Property

    public void request_DoWork(object sender, DoWorkEventArgs e)
    {
        var worker = (BackgroundWorker)sender;
        ClsComSettingMain clsComSettingMain = (ClsComSettingMain)e.Argument;
        string comPort = clsComSettingMain.comport;
        int baudRate = clsComSettingMain.baudRate;
    
        if (comPort != null && baudRate != 0)
        {
            SerialPort serialPort = new SerialPort(comPort, baudRate);
            serialPort.Open();
    
            while (true)
            {
                if (worker.CancellationPending)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    serialPort.Write(adv_request, 0, 3); // Write byte array to serial port, with no offset, all 3 bytes
                    Thread.Sleep(500);
                }
            }
        }
    
    }
    

    只需阅读CancelAsync 方法documentation,您自己就可以轻松回答这个问题。

    【讨论】:

    • @BastiAn 欢迎您。如果它适合您,您可以考虑投票和/或接受答案。通过这种方式,您将获得一些声望点数,并且对您未来的问题也更加关注。
    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 2018-03-18
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多