我必须实现基于客户端服务器的应用程序,其中客户端是Windows应用程序。现在,我的计划是创建一个Web服务作为服务器应用程序,并在我们的客户端应用程序中使用它。但问题在于通知。为此,我需要向客户端应用添加一个计时器来检查通知。它会减慢客户端应用程序的速度。
这样做的最佳方法是什么?
我需要为这两个应用创建设置。因此,解决方案必须是可部署的。
编辑:我不能将计时器放在后台或单独的线程中,因为我必须立即更新datagridview。
答案 0 :(得分:1)
使用BackgroundWorker或Threadpool.QueueUserWorkItem来调用Web服务,然后更新GUI。您的应用程序速度变慢,因为您从主UI线程调用Web服务,因此在完成Web服务调用之前,您的应用程序无法处理其他事件,包括重新绘制,调整大小,单击...
请参阅此文档:http://msdn.microsoft.com/en-us/library/ms951089.aspx
您想通过调用远程资源立即更新吗? 我担心这是不可能的,除非我们抛弃一个热力学定律并允许时间旅行。
但你可以欺骗和预取你的数据并在每隔XXX秒将其绑定在幕后。
更新网格时,请务必使用BeginUpdate
和EndUpdate
,以免出现任何闪烁。
答案 1 :(得分:0)
通过“创建一个web服务作为服务器应用程序并在我们的客户端应用程序中使用它”我假设您的意思是您将通过代理访问Web服务,而不是实际托管Web服务在您的客户端应用中。
您是否在后台线程上运行计时器?我得到的印象是你使用计时器来轮询网络服务并且它会占用你的用户界面,导致速度放缓(当然,还有其他因素需要考虑,但这是我当时最有可能看到的因素) )。
答案 2 :(得分:0)
您如何“检查通知”?这可能是一个愚蠢的建议,但启动一个新的线程来做到这一点可能会减轻客户端应用程序的命中?
答案 3 :(得分:0)
如果您使用的是WCF,则可能需要考虑Duplex services
双工服务合同是一条消息 交换模式中的两者 端点可以发送消息给 其他独立的。双工服务, 因此,可以发回消息 客户端端点,提供 类似事件的行为。复式 当客户端发生通信 连接到服务并提供 服务与通道上的 服务可以发回消息 客户。注意事件就好 双工服务的行为只能起作用 在一次会议中。
所以这可以避免计时器问题..
值得考虑的一些链接
答案 4 :(得分:0)
即使您需要使用结果更新UI,对其他线程进行检查的建议也是正确的。只需确保在表单上使用InvokeRequired属性和BeginInvoke方法。 BeginInvoke将调用该调用到UI线程。有关示例代码的详细说明,请参阅What's up with BeginInvoke?。此外,正如Florian Doyon所说,不要忘记在DataGridView上使用BeginUpdate和EndUpdate。