2017-09-28 47 views
1

我创建了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; 
} 

工人调用方法定期。

我认为返回false,当错误发生时,但我没有任何想法,如何做到这一点,如果方法返回string ...

是否有从着火的DoWork取消任何简单的方法代码片段?

+0

您可以用'出bool'参数也可以在例外的情况下,返回null或抛出异常给调用者和尝试捕捉检查有没有取消它的 –

+0

可能重复【如何正确地停止的BackgroundWorker( https://stackoverflow.com/questions/4732737/how-to-stop-backgroundworker-correctly) – oRole

回答

0

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

Background worker exception handling

+0

但异常火灾RunWorkerCompleted事件? DoWork运行期间是否会抛出未处理的异常? – Morpheus

+0

线程中止,并且RunWorkerCompletedEventArgs被发送到设置了.Error属性的RunWorkerCompleted事件。从RunWorkerCompleted中,抛出一个包含.Error消息的异常。请参阅我的答案中的链接。 – digimunk

+0

好的,我使用了迄今为止发生的事件,但是你明确告诉我,所以稍后再实施。 顺便说一句,我曾经用尽可能快的方法捕捉方法中的所有异常,因为我认为它会更安全。 – Morpheus

0

BackgroundWorker类有一个WorkerSupportsCancellation布尔告诉工人,工人是否支持取消与否。启用此功能,然后在您的后台工作人员DoWork事件中,检查CancellationPending,如果为true,则结束该线程,否则继续正常操作。使用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); 
    } 
} 
相关问题