如:客户端打开一个窗口,窗口初始化的时候, 可能要到服务器读一此绑定的数据,放在下拉框中,但是下拉框有个选择事件,它又会访问数据库读一些别的信息,这时候一般就会卡住。两次访问服务器之间的时间太短,我的程序是这样写的,
第一次访问服务器
1、打开通道
2、读数据库
3、关闭通道第二次访问服务器
1、打开通道
2、读数据库
3、关闭通道我目前 猜 的可能原因是不是,第一次刚刚关闭通道,在很短的时间里又打开通道就会卡住 ???

解决方案 »

  1.   

    内存够大吗?可以一次性把数据库中的信息保存到DataSet里面然后直接在本地客户端操作数据,这样就只需要访问服务器一次了!
      

  2.   

    3点建议:1、数据要尽量干练
    2、一次数据请求最好能获得尽量多的数据(不是无用数据),能合并的请求尽量合并一次完成
    3、为了达到UI的最佳效果,需要一些“欺骗”技巧,比如:先装载个Loading...
      

  3.   

          那平时是怎么设置的?? 我举个例子:
    模块A,文件名叫 a.dll, 还有叫模块b,文件名叫:b.dll
    现在a模块中的过程 void getdata1(),读数据库数据后,需要再调用b模块的过程void getdatadetail(),这个过程也要读数据库中的数据的,,,现在就出现问题了,会卡一段时间,平时按数据量一秒就行,可是这种情况下有时能卡到10秒后才把数据读出来
      

  4.   

    打开就不要关了,直到程序退出...Windows客户端没有Web那么多限制,这点儿资源消费得起...
      

  5.   

    不会,我现在为了节约服务器资源,都使用PerCall方式访问了,每次访问服务器,肯定会自动重新连接的,照样速度飞快,不曾有卡住。你再检查下是否有多线程锁,另外看看本机直接访问是否正常,你得排除网络因素。
      

  6.   

    跨模块又怎样?跨程序集都能实现...想一下数据库连接是怎么开闭的,把WCF客户端做为一个独立的provider设计,不用去管A模块还是B模块...
      

  7.   

    我的服务器过程契约是这样的[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall, UseSynchronizationContext = false)],这种有没有问题
      

  8.   

    那就要靠你去平衡了...比如自己构造一个pool建立空闲回收机制和连接状态检测等...如果是IIS承载的WCF就是HTTP协议,不存在“时时要跟服务器连接”,只是在客户端维持一个通道...看似麻烦,代价却远小于频繁开闭...
      

  9.   

    另外不是一个“变量”那么简单...你似乎还停留在Delphi或VB6的开发模式中,去看看OOADP的知识,WCF不止是一种通讯模式,也是一种开放式设计的理念...
      

  10.   

    可不可以在客户端设置多几个断点看看到底在那里浪费时间,再作下一步打算?
    还有,你说连续打开,干脆第一个通道关闭后先sleep两秒,再运行,看是不是运行后比两秒还要长很多
      

  11.   

    我是软件的,用net.tcp的, 搞个全局打开通道方法,我试过的,的确不会卡,但是只要网络断一回,这个通道就失效,再用时就出错,但是又没有找到判断这个通道失效的属性,所以又很麻烦
      

  12.   

    加try{}
      catch{}
    处理吧
      

  13.   

    1. 你的程序设计首先有问题,当你加载所有项的时候,不要触发改变事件。解决方案是设置一个开关变量,当加载的时候变量为false,加载完设置为true;在下拉框改变事件中判断是true才处理。
    2. wcf不会卡,我们做压力测试2000个用户并发访问都没有问题,何况你一个用户,应该是你的调用wcf的代码部分有问题,但是没有代码,不好说什么问题。
      

  14.   

    你添加InstanceContextMode = InstanceContextMode.PerCall后,ConcurrencyMode = ConcurrencyMode.Multiple是没有意义的,PerCall模式不需要设置ConcurrencyMode,肯定是每个访问独立的。
    PerCall模式下,没有连接与断开的概念,如果你客户端创建了与服务器端的一个连接实例,就全局保存它吧,因为那个实例永远不可能失效,即使客户端将网线拔掉,检查它的连接状态仍旧是已经连着的状态,不会显示为断开状态,除非自己手动去关闭连接。
    至于检测连接状态,找到你创建的ChannelFactory<IServer>对象,ChannelFactory<IServer>.State属性就是连接状态。
      

  15.   

    用remoting没出现个这种问题。
      

  16.   


    我说的WCF卡,不是后台WCF服务卡,而且客户端程序卡,这个我已经跟踪过了,不是网络问题,不是服务器问题,,
      

  17.   

    我是这么写的:    public static class DataManager
        {
            #region 私有变量
             static string uri = "localhost:12345";
            static IServer channel;
            #endregion        #region 属性
            public static string URI
            {
                get { return uri; }
                set
                {
                    uri = value;
                    channel = null;
                }
            }        public static IServer Channel
            {
                get
                {
                    if (channel == null)
                    {
                        ICollection<BindingElement> bindingElements = new List<BindingElement>();
                        TcpTransportBindingElement tcpTransport = new TcpTransportBindingElement() { TransferMode = TransferMode.Streamed, MaxReceivedMessageSize = 2147483647 }; ;
                        GZipMessageEncodingBindingElement compBindingElement = new GZipMessageEncodingBindingElement(new BinaryMessageEncodingBindingElement());
                        bindingElements.Add(compBindingElement);
                        bindingElements.Add(tcpTransport);
                        CustomBinding binding = new CustomBinding(bindingElements);
                        binding.Name = "tcpTransport";
                        EndpointAddress address = new EndpointAddress(new Uri("net.tcp://" + uri + "/Server/"));
                        ChannelFactory<IServer> channelFactory = new ChannelFactory<IServer>(binding, address);
                        channelFactory.Endpoint.Behaviors.Add(new ContextHeaderBehavior());
                        channel = channelFactory.CreateChannel();
                    }
                    return channel;
                }
            }
            #endregion
        }这只是一部分代码,使用时直接访问Channel属性,为null就自动初始化,除非外部改变URI,否则Channel只要初始化一次,以后不论网络状况如何,是否出现连接上的错误,都可以一直使用那个Channel。
      

  18.   

    你这里的IServer是不是从WCF通过引用服务创建的名称???
      

  19.   

    IServer就是一个接口定义,单独创建了一个只包含接口的项目,同时给服务端和客户端引用。虽然它支持通过引用服务的方式添加,但是除非是服务端已经写好并无法获知接口的情况,一般不用那个方法添加客户端引用,因为它那种方法很麻烦,还得服务端开启一下,然后客户端才能更新,更新后的效果说不定还会和接口不一致,不好控制。