【问题标题】:How to synchronize Silverlight clients with WCF?如何将 Silverlight 客户端与 WCF 同步?
【发布时间】:2011-01-05 16:45:33
【问题描述】:

这可能只是一些概念问题,但我似乎找不到理想的解决方案。

我想创建一个 Silverlight 客户端应用程序,它使用 WCF 通过一些自写的 Web 服务来控制第三方应用程序。如果有多个 Silverlight 客户端,则应同步所有客户端,即应将来自一个客户端的参数更改传播到所有客户端。

我设置了一个非常简单的 Silverlight GUI,用于处理传递给服务器的参数(类继承 INotifyPropertyChanged):

public double Height
    {
        get { return frameworkElement.Height; }
        set
        {
            if (frameworkElement.Height != value)
            {
                frameworkElement.Height = value;
                OnPropertyChanged("Height", value);
            }
        }
    }

OnPropertyChanged 负责传输数据。 WCF 服务 (duplex net.tcp) 维护所有客户端的列表,一旦它接收到数据包(带有参数更改描述的 XElement),它就会将此包转发给所有客户端,但接收包的客户端除外。

客户收到包裹,但现在我不确定,在内部设置属性的最佳方法是什么。如果我使用“高度”(见上文),则会生成一条新的更改消息并将其发送给所有其他客户端。

也许我可以使用数据字段 (frameworkElement.Height) 本身或函数 - 但我不确定以后是否会出现数据绑定问题。此外,我不想简单地复制部分代码属性,以防止出现冗余代码的错误。

那么你会推荐什么?

谢谢!

【问题讨论】:

    标签: silverlight wcf client-server inotifypropertychanged synchronize


    【解决方案1】:

    这里的一个常见解决方案是使用布尔值来跟踪 OnPropertyChanged 中的当前状态。可以在收到 WCF 数据包时设置为 true,如果为 true,则不重播。然后在设置属性后将其设置为 false。

    当您正常设置属性时,您只需将其保留为 false。这将导致它在内部设置时正常广播,但在通过 WCF 调用设置时不会。

    此选项有效,但需要小心才能正确。由于您将这个逻辑放在一个点上,因此应该很容易正确。

    【讨论】:

    • 哇 - 非常快的响应,谢谢!我曾想过这个解决方案,但我担心多线程可能会出现问题。
    • @user564226:可能会出现问题 - 尽管通常在 Silverlight 中,问题很小。您需要注意正确同步,但同样,由于所有这些都是在一个方法中处理的,因此通常很容易处理。
    • @user564226:如果你在这里使用多个线程,它可能需要一个锁来防止多个线程同时设置该属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多