背景工人事件处理

时间:2009-03-20 00:18:31

标签: c# multithreading debugging backgroundworker

我一直在努力处理后台工作线程中的事件处理。

我遇到的所有文档都让我相信,当DoWork事件处理程序抛出异常时,异常应该在RunWorkerCompleted处理程序中处理,并且该异常将在RunWorkerCompletedEventArgs的Error属性中可用。

这很好,但在调试期间,我总是看到用户代码消息未处理的异常。这让我相信我的方法存在问题。

我应该采取哪些措施来解决这个问题?

此致 乔纳森

3 个答案:

答案 0 :(得分:2)

我以前见过这种行为,并且通过使用System.Diagnostics.DebuggerNonUserCode属性修饰DoWork处理程序来解决这个问题:

[System.Diagnostics.DebuggerNonUserCode]
void bw_DoWork(object sender, DoWorkEventArgs e)
{ ... }

请注意,如果您在调试器中运行,则只会看到此内容;即使没有该属性,所有内容都是从shell运行时应该是这样。

我再次看了这个,我仍然看不出有什么理由要你这么做。我称之为调试器错误。

答案 1 :(得分:1)

我以前遇到过这个问题。只有在调试模式下不运行时才会设置e.Error。如果在Debug中运行,exectuion将在Exception的位置停止。但是,在非调试模式下运行相同的程序(在VS Debug中 - >在没有调试的情况下启动或按Ctrl + F5)并且不会出现讨厌的异常对话框,并且e.Error将是例外。不知道为什么,但这就是它的工作原理....

答案 2 :(得分:0)

你的方法是正确的。只需按下继续留言即可继续。如果有疑问,请在调试会话之外进行测试。