Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Silverlight客户端与WCF同步?_Silverlight_Wcf_Client Server_Inotifypropertychanged_Synchronize - Fatal编程技术网

如何将Silverlight客户端与WCF同步?

如何将Silverlight客户端与WCF同步?,silverlight,wcf,client-server,inotifypropertychanged,synchronize,Silverlight,Wcf,Client Server,Inotifypropertychanged,Synchronize,这可能只是一些概念上的问题,但我似乎找不到理想的解决方案 我想创建一个Silverlight客户端应用程序,它使用WCF通过一些自行编写的Web服务来控制第三方应用程序。如果有多个Silverlight客户端,则应同步所有客户端,即一个客户端的参数更改应传播到所有客户端 我设置了一个非常简单的Silverlight GUI,用于处理传递给服务器的参数(类继承INotifyPropertyChanged): OnPropertyChanged负责传输数据。WCF服务(duplex net.tcp)

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

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

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

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

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

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

那你有什么建议


谢谢

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

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


这个选项是可行的,但它确实需要小心才能正确使用。由于您将此逻辑放在一个点中,因此要获得正确的结果应该相当简单。

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

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


这个选项是可行的,但它确实需要小心才能正确使用。由于您将此逻辑放在一个点上,因此要获得正确的结果应该相当简单。

Whow-响应速度非常快,谢谢!我曾经考虑过这个解决方案,但我担心多线程可能会有问题。@user564226:可能会有问题——尽管在Silverlight中,通常情况下,它是最小的。您需要注意正确地进行同步,但同样,由于它都在一个方法中处理,因此通常很容易处理。@user564226:如果您在这里使用多个线程,可能需要一个锁来防止多个线程同时设置该属性。哇-响应速度非常快,谢谢!我曾经考虑过这个解决方案,但我担心多线程可能会有问题。@user564226:可能会有问题——尽管在Silverlight中,通常情况下,它是最小的。您需要注意正确地进行同步,但同样,由于它是在一个方法中处理的,因此通常很容易处理。@user564226:如果您在这里使用多个线程,可能需要一个锁来防止多个线程同时设置该属性。
public double Height
    {
        get { return frameworkElement.Height; }
        set
        {
            if (frameworkElement.Height != value)
            {
                frameworkElement.Height = value;
                OnPropertyChanged("Height", value);
            }
        }
    }