如何从方法代码的某些部分取消 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);
}
}
我创建了 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);
}
}