none
异步调用异常退出问题求助 RRS feed

  • 问题

  • 我做了个订阅系统,先实现的是下面的绿色代码,没有采用异步订阅,运行都很正常.

        [OperationContract(IsOneWay = true)]
          void Subscribe(Guid id);

     

                  try
                      {
                          m_proxy.Subscribe(m_guid);
                          subscribed = true;                                          
                      }
                      catch (Exception Ex)
                      {
                          MessageBox.Show(Ex.Message);
                       }

    但是,当我修改为下面的红色代码时,采用异步来实现订阅动作,却出现了问题. 服务正常连接断开都正常,但我故意断开客户端网络连接时,当异步订阅时,就没有出现网络访问异常报告,而是报告回调错误System .ServiceModel .Diagnostics.callbackException

    程序就退出了! 而同步时,会报告网络访问异常报告,程序还是可以使用,不会退出!

    请教下! 这个是什么问题啊? 该如何处理?

    非常感谢!

     

        try
           {
             m_proxy.BeginSubscribe(m_guid, OnLinkFuwuqiCompletionStartAutoForBeginSub, null);  
            }
                catch (Exception Ex)
                  {
                      MessageBox.Show(Ex.Message);
                   }
                      

    void  OnLinkFuwuqiCompletionStartAutoForBeginSub(IAsyncResult asyncResult)
            {
                m_proxy.EndSubscribe(asyncResult);
                subscribed = true;
            }

    2008年12月17日 8:27

答案

  • Hi,
       你描述的问题,我没有接触过。
       不过不论你同步测试还是异步测试的时候,都会会有创建代理proxy。我不知道你断开客户端网络连接的时间是如何选择的。
       如果你是在创建客户端代理之前就把网络断开,这个应该是直接出错的,因为你proxy无法和服务建立起有效的连接通道chanel。这个时候会出现异常,无法建立连接。
      至于异步调用的情况,你已经建立连接的时候,在吧网络断掉,执行异步回调的时候因为无法通过有效的chanel执行回调,也会出现错误。
      你可以使用DefaultContract来处理错误,结合try catch,保证程序对错误的良好容错性。
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月20日 10:13
    版主

全部回复

  •  

    帮忙指点下了!

    谢谢!

    2008年12月18日 13:20
  • Hi,
       你描述的问题,我没有接触过。
       不过不论你同步测试还是异步测试的时候,都会会有创建代理proxy。我不知道你断开客户端网络连接的时间是如何选择的。
       如果你是在创建客户端代理之前就把网络断开,这个应该是直接出错的,因为你proxy无法和服务建立起有效的连接通道chanel。这个时候会出现异常,无法建立连接。
      至于异步调用的情况,你已经建立连接的时候,在吧网络断掉,执行异步回调的时候因为无法通过有效的chanel执行回调,也会出现错误。
      你可以使用DefaultContract来处理错误,结合try catch,保证程序对错误的良好容错性。
    Frank.Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    老徐的博客:http://frank_xl.cnblogs.com
    2009年7月20日 10:13
    版主