C#Backgroundworker,带多个参数,不取消

C#Backgroundworker,带多个参数,不取消,c#,.net,multithreading,backgroundworker,cancellation,C#,.net,Multithreading,Backgroundworker,Cancellation,我正在使用一个具有多个参数的backgroundworker。 工人正在使用我的参数。 但我的问题是,我无法阻止幕后工作人员 .... BackgroundWorker workerGetAdvData; workerGetAdvData = new BackgroundWorker(); workerGetAdvData.DoWork += new DoWorkEventHandler(getAdvData.request_DoWork); workerGetAdvData.RunWorke

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

....
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();
        }
    }
}

但工人并没有停止。因为我在worker中使用的参数,它不工作吗

问候 巴斯蒂安


致以最诚挚的问候

在您的嫁妆代码中,您应该这样检查

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
方法,您就可以轻松回答这个问题。

@BastiAn欢迎您。如果它对你有用,你可以考虑投票和/或接受答案。通过这种方式,你将获得一些声誉积分,并对你未来的问题给予更多关注。