C# 调用带有try的方法时未捕获异常?

C# 调用带有try的方法时未捕获异常?,c#,.net,windows-phone-7,try-catch,C#,.net,Windows Phone 7,Try Catch,您好,我正在从web服务调用一些项,当它们返回时,我创建了一个为单独方法中返回的项定制的接口。现在,每当出现问题时,我都需要捕获异常并向用户显示一条消息 private void itemHelper_FeaturedItemsCalled(object sender, List<MyItem> _myItemList) { try { Dispatcher.BeginInvoke(() => { if(_

您好,我正在从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;
        }
    }
}
private void itemHelper\u featuredItemCalled(对象发送者,列表\u myItemList)
{
尝试
{
Dispatcher.BeginInvoke(()=>
{
如果(_myItemList!=0)
CreateInterface(_myItemList);
});
}
抓住
{
Dispatcher.BeginInvoke(()=>
{
LoadingScreen.Visibility=System.Windows.Visibility.Visible;
LoadingTextBlock.Text=“无法显示项目。”;
busyindicator 1.IsRunning=false;
}
}
}

现在我故意在方法CreateInterface()中抛出了一个异常。现在当这个方法运行时,我得到了一个未经处理的异常。为什么?我想既然这个方法是在try中调用的,它最终会在这里得到处理?

通过调用
BeginInvoke
你说的是“在调度程序线程中执行这个代码”.
BeginInvoke
是异步的,所以整个方法可能会在代码执行之前完成-那么它怎么可能进入catch块呢?到那时调用线程可能会位于完全不同的代码部分

如果您使用
Invoke
而不是
BeginInvoke
,则可能会将异常封送回调用方,但我从文档中看不到任何证据


编辑:此外,即使您成功捕获了异常,您也会从错误的线程访问UI…

尝试将Try-catch放在BeginInvoke中。发生的情况是,您在不同的线程上执行此代码,因此异常不会被不同的线程捕获。

需要不同的线程用于运行
BeginInvoke
调用的委托,因此在那里引发异常并且未经处理。感谢您的回答。我原本认为BeginInvoke是问题所在,但现在我知道了原因。如果我在BeginInvoke内部调用try/catch,它将捕获异常。@loyalpenguin:请参阅我的编辑以了解一个重要的额外要点-co您的catch块中的de需要另一个Invoke/BeginInvoke调用。是的,非常好。很抱歉,我正忙于替换原始值,所以删除了第二个BeginInvoke。我会解决它。我认为,通过将所有内容放在一个BeginInvoke中,我可以消除该问题。我只希望运行BeginInvoke不会对资源造成影响BeginInvoke里面的一切…@loyalpenguin:不,那应该没问题-只要你没有做任何应该在后台线程中的事情。注意,C#5中的异步功能将使所有这些变得简单。