我有一些在后台线程上运行的图像处理代码,并在使用Dispatcher.BeginInvoke()完成处理时更新UI线程上的Image控件。当我在调试器之外运行我的应用程序时,它经常崩溃。一旦我在调试器中运行它,我根本无法实现它。显然,时间差异足以让我的生活变得悲惨; - )
我已经尝试将try / catch块放在任何看似相关的代码周围,并记录出现的任何错误,但无济于事 - 它不知何故一直滑过我,我不知道还能在哪里看。< / p>
我希望使用调试器是设置调试器的异常捕获行为,以便在抛出任何异常时中断,但由于我无法在调试时发生异常,我无法找到我的代码抛出的位置
我可以附加到我崩溃的进程(因为它停留在屏幕上,只是完全没有响应),暂停调试器,并查看每个线程在代码中的位置,但这对我没有帮助 - 我不知道抛出的实际异常是什么。
有关如何进行的任何建议?
修改
答案 0 :(得分:2)
除了极少数例外情况,每个BeginInvoke
应该有一个对应的EndInvoke
对应项(请参阅此处more details why,但有一个例外是例如Control.BeginInvoke)。
缺少EndInvoke
可能是主线程未捕获异常并且您的应用程序终止的原因。
因为在您的特殊情况下,您正在处理Dispatcher
(未实现EndInvoke
),您将必须处理Dispatcher.UnhandledException事件以捕获在委托执行期间抛出的任何异常
顺便说一下,监听System.Diagnostics.Trace
消息的好工具是来自Sysinternals的DbgView。
答案 1 :(得分:1)
如果你从来没有抓过它,你怎么能确定这是一个例外?
此外,不是在整个地方放置try / catch块,而是将它们放置在边界处,尤其是在线程边界处。将它们放在任何ThreadStart方法或BeginInvoke调用的其他代码或回调方法等中。
答案 2 :(得分:-1)
你可以把一个try / catch放在静态Main上调用应用程序启动吗?因此,当应用程序崩溃时,您可以在某处输出堆栈跟踪和异常信息。