代码之家  ›  专栏  ›  技术社区  ›  Morpheus

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

  •  1
  • Morpheus  · 技术社区  · 7 年前

    我创建了Backgroundworker来操作串口,串口使用了不同类提供的一些方法。每次这些方法出现异常时,我都想取消一个worker。

    实际上,我知道如何使用事件来实现它,但我担心这不是最佳解决方案或良好实践。在这种情况下,我应该在每种方法中触发事件,这在我看来是无效的。

    例如,方法之一, 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,但我不知道如果方法返回该怎么办 string

    有什么简单的方法可以从代码的catch片段中取消DoWork吗?

    2 回复  |  直到 7 年前
        1
  •  0
  •   digimunk    7 年前

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

    Background worker exception handling

        2
  •  0
  •   Baddack    7 年前

    这个 BackgroundWorker 类具有 WorkerSupportsCancellation DoWork 事件,检查是否 CancellationPending ,如果为true,则结束线程,否则继续正常操作。

    CancelAsync() 函数将取消挂起设置为true。你应该把这个放在你的接球区。

    在我下面的示例中,我的后台工作人员处于一个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);
        }
    }