如何从方法代码的某些部分取消 backgroundworker

How to cancel backgroundworker from some part of method's code

我创建了 Backgroundworker 来在串行端口上运行,它使用不同 类 提供的一些方法。每次发生这些方法的异常时,我都想取消一个工人。

实际上,我知道如何使用事件来做到这一点,但恐怕这不是最佳解决方案或良好做法。在那种情况下,我应该在每个方法中触发事件,我认为这效率不高。

例如,来自方法的一个,ReceiveRecord 看起来像这样:

public string ReceiveRecord()
{
    try
    {
        var receivedLine = _serial.ReadLine();
        return receivedLine;
    }
    catch (TimeoutException exception)
    {
        MessageBox.Show($"Error was occured: \r\n {exception.Message}", "Timeout error",
            MessageBoxButton.OK, MessageBoxImage.Error);
        // HERE i want to fire worker cancellation 

    }
    return String.Empty;
}

Worker 定期调用该方法。

我考虑过在发生错误时返回 false,但我不知道该怎么做,if method returns string...

是否有任何简单的方法可以从代码的 catch 片段中触发 DoWork 取消?

不要在方法中捕获异常。让调用者在BackgroundWorker的RunWorkerCompleted事件中处理。

Background worker exception handling

BackgroundWorker class 有一个 WorkerSupportsCancellation 布尔值,它告诉工作人员是否支持取消。然后在你的 backgroundworker DoWork 事件中启用它,检查是否 CancellationPending,如果为真,结束线程,否则继续正常操作。

使用CancelAsync()函数设置取消挂起为真。你会想在你的 catch 块中设置它。

在我下面的示例中,我的后台工作程序处于 while 循环中,但它应该给你正确的想法。

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    try
    {
        while (true)
        {
            if (bw.CancellationPending)
                break;

            do_state_machine();
            Thread.Sleep(100);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}