在Silverlight中,如何在异步调用期间处理错误?

时间:2010-08-22 16:00:05

标签: c# silverlight asynchronous silverlight-4.0 .net-4.0

在我的SL4应用程序中,我有一个服务调用,svc.SubmitAsync()。由于这是一个异步调用,一旦方法被命中,我的代码就会转到下一行。只要用户输入正确的用户名和密码,这就没问题。如果没有,EndSubmit()会抛出异常。 EndSubmit()位于References.cs中,是自动生成的Silverlight代码的一部分。

我尝试在try-catch中包装svc.SubmitAsync(),但这是一个异步调用,并且甚至在抛出异常之前try-catch块就完成了。

如何捕获此错误?

谢谢!

更新1

public void SubmitTweetAsync(TestSilverlightApp.svc.Tweet tweet, object userState) {
            if ((this.onBeginSubmitTweetDelegate == null)) {
                this.onBeginSubmitTweetDelegate = new BeginOperationDelegate(this.OnBeginSubmitTweet);
            }
            if ((this.onEndSubmitTweetDelegate == null)) {
                this.onEndSubmitTweetDelegate = new EndOperationDelegate(this.OnEndSubmitTweet);
            }
            if ((this.onSubmitTweetCompletedDelegate == null)) {
                this.onSubmitTweetCompletedDelegate = new System.Threading.SendOrPostCallback(this.OnSubmitTweetCompleted);
            }
            base.InvokeAsync(this.onBeginSubmitTweetDelegate, new object[] {
                        tweet}, this.onEndSubmitTweetDelegate, this.onSubmitTweetCompletedDelegate, userState);
        }

更新2 - 这是一个WCF服务。

3 个答案:

答案 0 :(得分:1)

您必须检查处理程序中收到的参数中的“错误”字段。

private void Client_SubmitCompleted(object sender, SubmitCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        //...
    }
    else if (e.Error != null)
    {
        // the service operation threw an exception
        throw e.Error;
    }
    else
    {
        //...
    }

答案 1 :(得分:0)

通常是匹配的已完成事件,其中包含任何异常的try / catch。

与异步操作一样,它不知道它是否成功,直到它完成,但在任何一种情况下都会完成。

答案 2 :(得分:0)

传递给您的对象Completed事件处理程序将需要保存错误消息。

例如

public void OnSubmitCompleted(TweetOperation op) {   if(op.ErrorMessage!= null)//处理错误

}