wcf 多用户登录时,被阻塞的问题

zpc38368330 2017-05-22 03:21:14
我做了一个简单的仓库程序,允许多个保管员登录,但是发现一个问题,当一个保管员查询数据库时需要等待过长的时间,其余的管理员登录时会卡住,所以我模拟了下面的操作,测试发现WCF貌似不支持多线程.请看下面的简单模拟代码.
服务器端,两个函数
int foo1()
{
Thread.Sleep(100000);//模拟数据库查询的等待时间
return 1;.//随便返回个数字
}
int foo2()
{
return 2;
}

然后启动了两个客户端,
第一个客户端调用那个有Sleep的函数,foo1();//此时服务器端sleep100秒.
然后第二个客户端调用 foo2,这时发生了阻塞,第二个客户端一直等了100秒后,等第一个客户端的foo1函数执行完毕后才会得到结果 return2
这不是我想要的,用socket的时间我是每一个客户端给一个socket连接,并开启一个线程处理这个连接所有的请求数据,
理论上说wcf不会这么不讲理吧,这样怎么能处理多用户的频繁访问,请问各位大神都是怎样解决的这种问题?
...全文
218 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zpc38368330 2017-05-22
  • 打赏
  • 举报
回复
这个链接是asp.net的,无法用到wcf上
xdashewan 2017-05-22
  • 打赏
  • 举报
回复
引用 8 楼 zpc38368330 的回复:
我查了在服务器端的所有代码,可是并没有发现有maxConcurrentInstances的设置,也就是说这个值使用的是默认值,貌似默认值应该很大,不应该仅两个客户端的连接就造成阻塞啊
你可以试试http://www.cnblogs.com/z2002m/archive/2012/10/26/1918342.html,我并不确定是否有效
zpc38368330 2017-05-22
  • 打赏
  • 举报
回复
我查了在服务器端的所有代码,可是并没有发现有maxConcurrentInstances的设置,也就是说这个值使用的是默认值,貌似默认值应该很大,不应该仅两个客户端的连接就造成阻塞啊
xdashewan 2017-05-22
  • 打赏
  • 举报
回复
引用 6 楼 zpc38368330 的回复:
不好意思,发错了信息 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] public partial class Service1 : IService1 我用的是 PerSession
那看看config里maxConcurrentInstances设置的多少,一般wcf确定了ConcurrencyMode和InstancingMode就可以了
zpc38368330 2017-05-22
  • 打赏
  • 举报
回复
不好意思,发错了信息 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] public partial class Service1 : IService1 我用的是 PerSession
zpc38368330 2017-05-22
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!--<system.web> <compilation debug="true" /> </system.web>--> <!-- 部署服务库项目时,必须将配置文件的内容添加到 主机的 app.config 文件中。System.Configuration 不支持库的配置文件。--> <system.serviceModel> <bindings> <netTcpBinding> <binding name="NewBinding0"> <security mode="None" /> </binding> </netTcpBinding> </bindings> <services> <service name="WcfService.Service1"> <endpoint address="net.tcp://localhost:10010/Service1" binding="netTcpBinding" bindingConfiguration="NewBinding0" contract="WcfService.IService1"> <identity> <dns value="localhost" /> </identity> </endpoint> <!--<endpoint address="net.tcp://127.0.0.1:10010/Service1" binding="netTcpBinding" bindingConfiguration="NewBinding0" contract="WcfService.IService2"> </endpoint>--> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="http://127.0.0.1:10011/Service1/" /> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior> <!-- 为避免泄漏元数据信息, 请在部署前将以下值设置为 false 并删除上面的元数据终结点 --> <serviceMetadata httpGetEnabled="True"/> <!-- 要接收故障异常详细信息以进行调试, 请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息--> <serviceDebug includeExceptionDetailInFaults="False" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration> 用的是默认的
xdashewan 2017-05-22
  • 打赏
  • 举报
回复
引用 2 楼 zpc38368330 的回复:
菜菜的问句,怎么看是不是single?
检查你的ServiceBehavior的InstanceContextMode,默认是PerSession的
zpc38368330 2017-05-22
  • 打赏
  • 举报
回复
[ServiceContract(CallbackContract = typeof(IMessageCallback))] public interface IService1
zpc38368330 2017-05-22
  • 打赏
  • 举报
回复
引用 1 楼 xdashewan 的回复:
你wcf实例是Single?
菜菜的问句,怎么看是不是single?
xdashewan 2017-05-22
  • 打赏
  • 举报
回复
你wcf实例是Single?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧