如:客户端打开一个窗口,窗口初始化的时候, 可能要到服务器读一此绑定的数据,放在下拉框中,但是下拉框有个选择事件,它又会访问数据库读一些别的信息,这时候一般就会卡住。两次访问服务器之间的时间太短,我的程序是这样写的,
第一次访问服务器
1、打开通道
2、读数据库
3、关闭通道第二次访问服务器
1、打开通道
2、读数据库
3、关闭通道我目前 猜 的可能原因是不是,第一次刚刚关闭通道,在很短的时间里又打开通道就会卡住 ???
第一次访问服务器
1、打开通道
2、读数据库
3、关闭通道第二次访问服务器
1、打开通道
2、读数据库
3、关闭通道我目前 猜 的可能原因是不是,第一次刚刚关闭通道,在很短的时间里又打开通道就会卡住 ???
2、一次数据请求最好能获得尽量多的数据(不是无用数据),能合并的请求尽量合并一次完成
3、为了达到UI的最佳效果,需要一些“欺骗”技巧,比如:先装载个Loading...
模块A,文件名叫 a.dll, 还有叫模块b,文件名叫:b.dll
现在a模块中的过程 void getdata1(),读数据库数据后,需要再调用b模块的过程void getdatadetail(),这个过程也要读数据库中的数据的,,,现在就出现问题了,会卡一段时间,平时按数据量一秒就行,可是这种情况下有时能卡到10秒后才把数据读出来
还有,你说连续打开,干脆第一个通道关闭后先sleep两秒,再运行,看是不是运行后比两秒还要长很多
catch{}
处理吧
2. wcf不会卡,我们做压力测试2000个用户并发访问都没有问题,何况你一个用户,应该是你的调用wcf的代码部分有问题,但是没有代码,不好说什么问题。
PerCall模式下,没有连接与断开的概念,如果你客户端创建了与服务器端的一个连接实例,就全局保存它吧,因为那个实例永远不可能失效,即使客户端将网线拔掉,检查它的连接状态仍旧是已经连着的状态,不会显示为断开状态,除非自己手动去关闭连接。
至于检测连接状态,找到你创建的ChannelFactory<IServer>对象,ChannelFactory<IServer>.State属性就是连接状态。
我说的WCF卡,不是后台WCF服务卡,而且客户端程序卡,这个我已经跟踪过了,不是网络问题,不是服务器问题,,
{
#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。