C# 视窗表格及;WCF-客户端应用程序通信

C# 视窗表格及;WCF-客户端应用程序通信,c#,winforms,wcf,wcf-binding,C#,Winforms,Wcf,Wcf Binding,我们正在开发一个Windows窗体应用程序,将安装在大约1000台员工电脑上。用户可以同时运行该应用程序的多个实例。客户机都在一个内部网上 应用程序中的更改可能会导致数据库记录更改,而数据库记录更改又必须与其他客户端通信,以便更新其UI 我们的团队讨论了两种不同的方法: 1。多播数据包 源客户端修改记录,然后发送一个多播数据包,其中的有效负载发生了变化。其他客户机接收此消息并获取指定的数据。我们需要考虑数据包未被接收的情况,然后重新主动检索数据 我现在的问题是,客户如何知道它没有收到数据包?(不

我们正在开发一个Windows窗体应用程序,将安装在大约1000台员工电脑上。用户可以同时运行该应用程序的多个实例。客户机都在一个内部网上

应用程序中的更改可能会导致数据库记录更改,而数据库记录更改又必须与其他客户端通信,以便更新其UI

我们的团队讨论了两种不同的方法:

1。多播数据包

源客户端修改记录,然后发送一个多播数据包,其中的有效负载发生了变化。其他客户机接收此消息并获取指定的数据。我们需要考虑数据包未被接收的情况,然后重新主动检索数据

我现在的问题是,客户如何知道它没有收到数据包?(不知道你不知道什么)这让我们看到数据库中带有时间戳的某种事件日志,UI控件跟踪它们上次更新的时间。他们进入焦点,检查他们的时间戳,并根据需要进行更新

还有人说,UI元素每次进入焦点时都会重新加载(想想outlook中的模式,用CAB将控件带到堆栈工作区的前面)。多播是为了更新客户端,使其当前上下文发生了变化。如果他们错过了,他们会处理陈旧的数据,直到他们改变模式并返回

2。WCF和回调

客户端通过tcp绑定向WCF合同注册回调。这方面的主要技术问题是服务器维护许多打开的套接字。我们已经读到了传统意义上它是如何不打开的,它被置于睡眠状态最多90秒,然后在这一点上重新建立。我们还了解了Windows2003服务器可以处理的最大打开连接数,以及如何在注册表中修改这些连接

如果我们有1000个到服务器的开放套接字连接,这会崩溃吗


如果有人遇到过同样的情况,并尝试或评估过WCF方法,我们很乐意听听。

我没有实施过这样的情况。然而,我认为其中一个双工绑定不一定会有很高的开销

这完全取决于服务器需要向客户端发送多少信息。我知道您说过这些信息将用于他们更新用户界面。然而,他们似乎不可能同时都需要相同数量的信息。例如,如果关于西部地区的信息发生了变化,那么所有1000名客户可能都想知道发生了变化,他们可能都想更新关于西部地区的摘要级信息,但可能只有1/4的客户需要查看变化的详细信息

如果是这种情况,那么我建议回调只提供关于已更改内容的信息,主要是在摘要级别。让那些对变更细节感兴趣的客户询问细节。您甚至可以提供最高层的一个或两个层次的所有详细信息,而对于其他层次,只需包含“这一点在时间上发生了变化”的信息。这样,根据特定客户端查看的层次结构级别,客户端可以询问也可以不询问

如有必要,您可以一起批处理更新。如果客户端每秒只需要更新一次,那么您可以将最后一秒的更改累积起来,然后一次发送所有更改


您可能还希望对某些任务使用一些对等绑定。也许您业务中某个特定领域的客户希望了解彼此的工作内容—诸如此类。

我没有实施过这样的情况。然而,我认为其中一个双工绑定不一定会有很高的开销

这完全取决于服务器需要向客户端发送多少信息。我知道您说过这些信息将用于他们更新用户界面。然而,他们似乎不可能同时都需要相同数量的信息。例如,如果关于西部地区的信息发生了变化,那么所有1000名客户可能都想知道发生了变化,他们可能都想更新关于西部地区的摘要级信息,但可能只有1/4的客户需要查看变化的详细信息

如果是这种情况,那么我建议回调只提供关于已更改内容的信息,主要是在摘要级别。让那些对变更细节感兴趣的客户询问细节。您甚至可以提供最高层的一个或两个层次的所有详细信息,而对于其他层次,只需包含“这一点在时间上发生了变化”的信息。这样,根据特定客户端查看的层次结构级别,客户端可以询问也可以不询问

如有必要,您可以一起批处理更新。如果客户端每秒只需要更新一次,那么您可以将最后一秒的更改累积起来,然后一次发送所有更改


您可能还希望对某些任务使用一些对等绑定。也许您业务中某个特定领域的客户希望了解彼此正在做的事情——这类事情。

您提到了我们已经讨论和正在考虑的许多事情,例如批量更新。您需要强调的是,我没有完全描述环境,但在地理位置相邻的建筑物中,同一物理LAN上大约有1000个用户。数据不跨越多个垂直区域,所有用户几乎都在查看相同的数据,它只是一些可以编辑的项目,而大多数不能,例外是个人组织模块。我认为你的答案是h