为了账号安全,请及时绑定邮箱和手机立即绑定

WCF服务,寄宿在Winform窗体中,项目中的性能问题,急需人才给点点子

WCF服务,寄宿在Winform窗体中,项目中的性能问题,急需人才给点点子

互换的青春 2018-12-07 04:44:44
这个问题很紧急,希望知道的朋友能够告诉我,或者来视频或语音交流也在所不惜,因为我这方面的经验实在是太缺乏了... 说下项目的具体环境: 1. Andirons前端点菜,基于IPad的点菜系统 2. WCF后台服务(很简单的WCF服务,就使用了一下ServiceHost开启下服务,发布一下定义的接口)   说下我的问题: 1. 10台IPad同时提交菜单,会出现卡死的现象(这个卡死就是反应时间太长,隔个半天才有反应) (当时我的猜测是后台窗体是单线程操作,会出现排队等待的现象,是否应该使用异步(多线程)来做) 这种问题是否是并发问题,该怎么解决呢?   2. 如果WCF服务开的时间长了,那么Andirons端在调用的时候会出现延迟的情况 (为什么服务的开的时间越久,Andirons端调用的反应也会越来越慢) Service重启之后,速度就会非常的快,这到底是什么原因呢?   3. 对于第一个问题,如果每个跟数据库交互的方法都要用异步来做,编程困难会不会很大   下面是我的AppConfig文件 <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="LoggingManager" type="Transight.Common.Logging.LoggingManagerSection,Transight.Common.Logging"/> <section name="DBAccessBroker" type="Transight.Common.DBAccessBroker.DBAccessBrokerSection,Transight.Common.DBAccessBroker"/> <section name="MessageBusService" type="Transight.Common.MessageBus.Transports.TransportSettings,Transight.Common.MessageBus.Transports"/> </configSections> <system.serviceModel> <services> <service name="Transight.POS.FrontendService.JsonService.Operations" behaviorConfiguration="FrontendService"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="httpBinding_Config" contract="Transight.POS.FrontendService.Contracts.IJsonOperation" > </endpoint> <host> <baseAddresses> <add baseAddress="http://localhost/FrontendWebService/"/> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior name="FrontendService"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> <bindings> <basicHttpBinding> <binding name="httpBinding_Config" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" messageEncoding="Text" sendTimeout="00:10:00"> <security mode="None"></security> <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647"/> </binding> </basicHttpBinding> </bindings> <serviceHostingEnvironment multipleSiteBindingsEnabled="false" /> </system.serviceModel> <LoggingManager> <Loggings> <add LoggingName="Default" LoggingEntity="FileLogging" LogFilePath="c:\Log" LogSeparateByLevel="true" LogFileName="Transight.POSV4.Logs"/> <!--<add LoggingName="PluginRuntime" LoggingEntity="FileLogging" LogFilePath="c:\Log" LogSeparateByLevel="true" LogFileNamee="Transight.POSV4.Logs" LogSource="PluginRuntime"/> <add LogSource="PrintingMgr" LoggingName="PrintingMgrLog" LoggingEntity="FileLogging" LogFilePath="c:\Log" LogSeparateByLevel="true" LogFileName="Transight.POSV4.Logs"/> <add LogSource="PrintingJob" LoggingName="PrintingJobLog" LoggingEntity="FileLogging" LogFilePath="c:\Log" LogSeparateByLevel="true" LogFileName="Transight.POSV4.Logs"/>--> </Loggings> </LoggingManager> <DBAccessBroker> <DBAccess FullName="Transight.Common.DBAccess.SQLDBAccess" Namespace ="Transight.Common.DBAccess"/> <DBConnections> <add ConfigFile="C:\CommonConfig.xml" ConnStringNode="ConnStr" IsConnStrEncrypted="false" SystemName="Tablet" IsServer="false"/> </DBConnections> </DBAccessBroker> <MessageBusService ServiceAddress="net.tcp://192.168.23.50:8787/MessageBusService" /> </configuration>
查看完整描述

22 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

那现在只能寄宿在窗体中了,有什么好的优化方案吗?对于越来越慢的问题,有没有好的方案...

查看完整回答
反对 回复 2019-01-21
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

@程序猿就是我: 现在我的做法是:

1.把服务单独放到一个线程里面

Thread thread = new Thread(StartService) { IsBackground = true };
thread.SetApartmentState(ApartmentState.MTA);
thread.Start();

2.然后设置并发模式以及实例模式

[ServiceBehavior(UseSynchronizationContext = false, ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall)]

3.在配置文件里面增加并发量连接数

<serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000"/>

不知道这些配置能不能够满足这些配置。。。

查看完整回答
反对 回复 2019-01-21
?
精慕HU

TA贡献1845条经验 获得超8个赞

@程序猿就是我: 其实你说的那些操作我们还有一个POS机系统来进行控制!

查看完整回答
反对 回复 2019-01-21
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

对的,其实你说的业务流比较复杂了,我们后台紧紧查看那每个ipad的状态,以及点了多少菜!

我想请教下,怎么通过代码解决一下并发的问题呀!

查看完整回答
反对 回复 2019-01-21
?
RISEBY

TA贡献1856条经验 获得超5个赞

你选择winform,肯定是有业务需要的。业务流程是不是这样的,前端选择菜,通过wcf传输给后端,后端通过winform显示客户点的菜,然后后厨看看有没有原材料了,也就是能否接受这个点菜,接受与否都会操作一下,然后你的前端会看到效果,决定继续点菜还是告诉客人换菜,后厨做好菜了,就通过winform操作一下,前端收到菜已做好的信号,就去拿菜给客人,业务流程是不是这样的呢?整个过程需要后端winform和前端的交互。所以你选择winform作为host。

查看完整回答
反对 回复 2019-01-21
?
largeQ

TA贡献2039条经验 获得超7个赞

@Artech: 老A,除了上面的建议之外,对于我写出来的问题,你还有什么建议指点给我呀?谢谢了!

查看完整回答
反对 回复 2019-01-21
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

@程序猿就是我: Service类型

查看完整回答
反对 回复 2019-01-21
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

这个特性是放在我发布的接口上面还是实现接口的类上面?老A

查看完整回答
反对 回复 2019-01-21
?
湖上湖

TA贡献2003条经验 获得超2个赞

应用[ServiceBehavior(UseSynchronizationContext = false)]

查看完整回答
反对 回复 2019-01-21
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

大哥,有没有什么好点子告诉我,一直没有接触过服务编程啊,求解!

查看完整回答
反对 回复 2019-01-21
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

对。可以 放在console中。

查看完整回答
反对 回复 2019-01-21
?
ibeautiful

TA贡献1993条经验 获得超5个赞

寄宿在IIS吧,自寄宿的EXE,默认都是单线程处理的。。。。。。。。。。。。

所以越来越慢。。。。。。。。。

查看完整回答
反对 回复 2019-01-21
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

@arg: 谢谢你啊,我会认真看文章的,有问题我再联系你啊!

查看完整回答
反对 回复 2019-01-21
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

配置文件已经贴上去了,求指教!

查看完整回答
反对 回复 2019-01-21
?
MYYA

TA贡献1868条经验 获得超4个赞

你想看AppConfig文件吗?

查看完整回答
反对 回复 2019-01-21
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

1,把配置拿出来看看,并发10个不算什么。

2,说明程序写的有问题,有资源没释放或者内存泄露的情况,很有可能数据库连接用完没释放。

3,推测点菜什么的数据量不大,逻辑也不耗时,没必要异步。

4,如上,另外用个非UI线程用来跑host

查看完整回答
反对 回复 2019-01-21
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

@無限遐想: 哪有这么容易就能改变啦,因为这个窗体里面还有一些操作!

查看完整回答
反对 回复 2019-01-21
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

@無限遐想: 宿主 改 一下。怎么会麻烦呢?你直接在program理,直接启动就好了。不要调用窗体。加一个console.readline()

查看完整回答
反对 回复 2019-01-21
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

@程序猿就是我: 是不是 宿主 有何 ui 进行交互的地方呢?按理说 开几个 是没有问题的哦。本来 就是多线程哦。除非 有共享资源哦。

查看完整回答
反对 回复 2019-01-21
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

这个好像不现实了,项目已经做的快好了,现在该宿主会很麻烦的!

查看完整回答
反对 回复 2019-01-21
  • 22 回答
  • 0 关注
  • 915 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信