您好我正在从Web服务中调用一些项目,当他们回来时,我创建了一个专门针对单独方法中返回的项目的界面。现在,每当出现问题时,我都需要捕获异常并向用户显示消息。
private void itemHelper_FeaturedItemsCalled(object sender, List<MyItem> _myItemList)
{
try
{
Dispatcher.BeginInvoke(() =>
{
if(_myItemList != 0)
CreateInterface(_myItemList);
});
}
catch
{
Dispatcher.BeginInvoke(() =>
{
LoadingScreen.Visibility = System.Windows.Visibility.Visible;
LoadingTextBlock.Text = "Unable to display items.";
BusyIndicator1.IsRunning = false;
}
}
}
现在我故意在方法 CreateInterface()中引发异常。现在,当这个运行时,我得到了未处理的异常。这是为什么?我想是因为这个方法在try中调用了,最终会在这里得到处理?
答案 0 :(得分:7)
通过调用BeginInvoke
,你说,“在调度程序线程中执行此代码”。 BeginInvoke
是异步的,所以整个方法可能会在代码执行之前完成 - 那么它怎么可能进入catch块呢?到那时,调用线程可能会在完全不同的代码段中。
可能如果您使用Invoke
代替BeginInvoke
,可能将异常编组回调用者 - 但我可以从文档中看不到任何证据。
编辑:此外,即使你已经设法捕获异常,你也会在那时从错误的线程访问UI ...
答案 1 :(得分:4)
尝试将try catch放在BeginInvoke中。发生的事情是您在不同的线程上执行此代码,因此不同的线程不会捕获异常。