none
请教一个老问题 RRS feed

  • 问题

  • xu lei,
    你好,
    我的程序最近又开始报这个错误。这个错误在我使用IE直接浏览时才会出现,当我用VS调试运行时就不会出现这个问题。
    我的使用代理的代码是这样写的,请你帮我看看吧。
            public static List<ArticleCatalogInfo> GetArticleCatalogInfos()
            {
                using (ArticleCatalogServiceProxy ACSProxy = new ArticleCatalogServiceProxy())
                {
                    if (!enableCaching)
                    {
                        if (ACSProxy.State != CommunicationState.Opened)
                        {
                            ACSProxy.Open();
                        }
                        return ACSProxy.GetArticleCatalogInfos().ToList<ArticleCatalogInfo>();
                    }

                    string cacheKey = "ArticleCatalog_GetArticleCatalogInfos";

                    List<ArticleCatalogInfo> ACInfoList = (List<ArticleCatalogInfo>)HttpRuntime.Cache[cacheKey];
                    if (ACInfoList == null)
                    {
                        if (ACSProxy.State != CommunicationState.Opened)
                        {
                            ACSProxy.Open();
                        }

                        ACInfoList = ACSProxy.GetArticleCatalogInfos().ToList<ArticleCatalogInfo>();
                        AggregateCacheDependency acd = DependencyFacade.GetArticleCatalogDependency();
                        AddToCache(cacheKey, ACInfoList, acd);
                    }
                    return ACInfoList;
                }
            }


    做最好的自己


    Hi,
       不要使用静态static的方法,这样连接会再加载类库的时候就实例化了,长时间肯定通道出错.~


    1  为什么会出错.  代码不是已经写上了. using (ArticleCatalogServiceProxy ACSProxy = new ArticleCatalogServiceProxy())

    当这个方法调用完成时.应该会自动释放资源才对啊. 

    2  如果还是使用静态方法, 但再加了ACSProxy.Close()     这样会不会出错呢.  


      


    学习者
    2009年9月29日 8:41

答案

  • Hi,
      你们好~
    呵呵。
      静态方法或者静态对象的生存周期不同。
      你的方法是静态的,Using解决的是对象的回收问题。
      这个静态方法你不在调用的时候可能就要维护了一个全局的连接对象。
      而WCF的连接通道存在一个默认超时异常的问题。
      这个是当时的我回复问题考虑的原因。


      你们现在测试还有问题吗?
     不妨把错误发出来大家一起讨论一下
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年9月30日 4:46
    版主

全部回复

  • 你好,这个问题就是我问的。
    对于你说的使用using和调用Close方法其实是一样的。
    当时我以为我明白了,后来突然想起了这个问题,觉得好像也不能这么解释,后来又给忘了问了。
    虽然我的这段代码是静态方法,但里面并没有对象的状态,每次调用的时候都应该从新执行一遍才对的。
    而每次执行,代理都会被释放掉。不过这个问题有时有,有时又没有,有时开机后打开IE运行程序,就会报这个错。
    等待Xu Lei的帮忙。

    做最好的自己
    2009年9月29日 13:45

  •   你是不是放到服务器上测试的时候就有错误?

      是不是并发问题?    但从代码上面看不出来是啊.
    学习者
    2009年9月29日 15:44

  •  你的ArticleCatalogServiceProxy 类实现了Idispose接口吧。 

    你用的是PreSession吧。 
    学习者
    2009年9月29日 15:46
  • Hi,
      你们好~
    呵呵。
      静态方法或者静态对象的生存周期不同。
      你的方法是静态的,Using解决的是对象的回收问题。
      这个静态方法你不在调用的时候可能就要维护了一个全局的连接对象。
      而WCF的连接通道存在一个默认超时异常的问题。
      这个是当时的我回复问题考虑的原因。


      你们现在测试还有问题吗?
     不妨把错误发出来大家一起讨论一下
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年9月30日 4:46
    版主


  •     有空测试一下.  难道是UsING不能回收静态方法里面的对像? 

      
    学习者
    2009年9月30日 4:56
  • 能回收
    buguo
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年9月30日 8:15
    版主