【问题标题】:Backgroundworker thread displays error message on leaving pageBackgroundworker 线程在离开页面时显示错误消息
【发布时间】:2010-06-22 10:14:25
【问题描述】:

我目前正在用 VS2010 C# 开发向导。倒数第二页是带有进度条的进度页面。正在执行的工作需要很长时间。所以我创建了一个Backgroundworker线程并在DoWork中进行了冗长的操作。我使用 ProgressChanged 事件更新进度条。冗长过程的代码位于单独的操作类中。我从 DoWork 事件中调用该类中的静态方法。在操作类中引发异常。

一切正常。即DoWork事件成功调用了我的actions类中的静态方法,ProgressChanged事件成功更新了进度条,RunWorkerCompleted成功捕获了异常。

但是,当我从“进度”页面移到“完成”页面时,再次显示异常错误消息 - 我没有任何代码(即没有 MessageBox.Show)。

在这个阶段我没有包含我的任何代码,因为它与 MSDN 示例相同。

我知道这与工作代码位于单独的类中或我调用静态函数无关。我已将代码移动到进度页面本身(如 MSDN 示例中)并使用私有方法而不是静态方法,但我仍然看到此错误消息。

但是,如果我将对我的操作类的 DoWork 调用包含在 try-catch 块中,则不会显示错误消息。但是,RunWorkerCompleted 事件不会捕获异常。此外,不推荐在 DoWorker 中进行 try-catch 调用。但有趣的是这解决了问题!

如果有人能对此有所了解,我将不胜感激?

【问题讨论】:

  • "...和 ​​MSDN 的例子一样" 请给我们链接,这样更容易找到。
  • 并发布来自 DowWork 和 Completed 的代码(大纲),以确保。
  • 抱歉,如果格式不正确 - 我是新来的!
  • MSDN 示例的链接是:msdn.microsoft.com/en-us/library/…
  • 嗨 DHN 和 Henk, 只是想知道您是否有任何想法?我注意到我错过了 RunWorkerCompleted 中的“else if (e.cancelled)”。由于我在后台工作线程中没有取消,所以我认为这并不重要——但我尝试了以防万一——这并没有什么不同。昨晚花了几个小时在网上搜索,但找不到任何关于这个特定问题的参考!因此,我们将不胜感激任何帮助。

标签: c# multithreading


【解决方案1】:

从您的操作类抛出的异常将在调用堆栈中冒泡,在本例中是您的 BackgroundWoker 的 DoWork 方法,然后向上。由于您没有 try/catch,这将导致异常冒泡而未被捕获,VS 调试器会将其显示给您。

  1. 要么用 System.Diagnostics.DebuggerNonUserCodeAttribute() 装饰你的 DoWork 处理程序。

  2. 在 Release 模式下运行程序,而不是 Debug

  3. 在您的 Visual Studio 中,转到 Debug -> Exceptions 并取消选中抛出的异常。

【讨论】:

  • 不,Bgw 从 DoWork 捕获异常,并将它们呈现在 Completed 事件中。
  • 对不起,我应该说清楚 - 这是在发布模式下发生的。在调试模式下,调试器会捕获异常,如 MSDN 示例中所述。
猜你喜欢
  • 2022-10-20
  • 1970-01-01
  • 2013-09-20
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多