运行下面真正简单的程序我希望在单击button1时执行'FILTER REACHED',但它不会被命中(无论是否附加调试器)。任何想法......?
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
new Thread(() =>
{
Dispatcher.CurrentDispatcher.UnhandledExceptionFilter += Dispatcher_UnhandledExceptionFilter;
doer();
}).Start();
}
void Dispatcher_UnhandledExceptionFilter(
object sender,
DispatcherUnhandledExceptionFilterEventArgs e)
{
MessageBox.Show("FILTER REACHED");
}
private void doer()
{
throw new NotImplementedException();
}
}
由于
答案 0 :(得分:1)
根据Dispatcher
上的文档(找到here),只有在Invoke
或BeginInvoke
引发未捕获的异常时,才会使用过滤器函数Dispatcher
上的方法。
如果您将doer()
替换为Dispatcher.CurrentDispatcher.Invoke(doer)
(或类似),会发生什么?
答案 1 :(得分:0)
您正在从不是调度程序线程的线程调用方法(doer)。您必须使用Dispatcher调用该方法以捕获异常以进行过滤。
new Thread(() =>
{
Dispatcher.CurrentDispatcher.UnhandledExceptionFilter += Dispatcher_UnhandledExceptionFilter;
Dispatcher.Invoke(new Action(()=>doer()));
}).Start();
答案 2 :(得分:0)
尝试以下代码
new Thread(() =>
{
Dispatcher.CurrentDispatcher.UnhandledExceptionFilter += Dispatcher_UnhandledExceptionFilter;
Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Normal, new ThreadStart(delegate
{
doer();
}));
}).Start();
答案 3 :(得分:0)
您是否尝试过使用AppDomain.UnhandledException?