从System.Windows.Forms.Timer发出调用WCF服务的问题

时间:2014-04-10 01:59:01

标签: c# winforms wcf

我正在努力配置WCF服务和客户端。简而言之,我正在研究具有需要托管WCF服务的C#Winform燃料服务器程序的解决方案。燃油服务器的主要功能是与控制燃油加油机的硬件连接。

燃料服务器是一个简单的应用程序,它承载客户端应用程序可访问的WCF服务。 WCF服务公开允许客户端授权,取消授权,获取泵状态等的方法......服务类通过在提供对分配器控制器的访问的COM对象上执行方法来实现此目的。我已使用.NET配置实用程序成功生成并托管了该服务。

服务的客户端也是C#Winform应用程序,它们基本上提供用于查看分配器状态并与它们交互的UI(即授权,取消授权等等)。当客户首次启动时,他们获得服务的代理并调用几种方法进行初始化(即设置泵价等)。所有这些对服务的调用都是成功的。

但是,初始化完成后,客户端会将每个分配器的PumpWidget UserControl添加到面板中。然后启用System.Windows.Forms.Timer对象,为每个小部件每1000ms打勾。在tick事件中,客户端获取WCF服务的代理并调用服务上的方法以获取状态。所有这些服务调用都失败,并显示一条消息,指出无法找到端点。

有人能告诉我从System.Windows.Forms.Timer对象中调用WCF服务是否安全?我无法弄清楚为什么在事件处理程序内部的调用失败时,所有对服务的调用都在timer事件之外成功。

1 个答案:

答案 0 :(得分:0)

.NET Framework中有三个计时器控件:

  • 基于Windows的计时器,始终位于Visual Studio工具箱(System.Windows.Forms.Timer)中
  • 基于服务器的计时器,您可以将其添加到Visual Studio工具箱(System.Timers.Timer)
  • 线程计时器,以编程方式可用(System.Threading.Timer)

如果您使用的是Windows窗体并且可能正在更新UI,请使用System.Windows.Forms.Timer。

对于基于服务器的计时器功能,您可以考虑使用System.Timers.Timer,它也更准确并具有其他功能。

第三个,System.Threading.Timer,使用一个单独的线程进行操作。如果您需要定期执行异步作业,则可能很有用。