同步套接字/网络连接的对象 - 最佳实践不使用WCF?

时间:2009-11-11 05:17:30

标签: c# sockets synchronization

通过套接字连接同步对象的好方法是什么?

这是我到目前为止所想到的。

对象在其getter和setter中调用Update方法,该方法通过套接字连接将所有类的信息传输到其他连接的客户端。要在客户端上更新这些更改,将调用一个重载方法,该方法基本上为字符串解析其成员的值并相应地设置它们。

这是一种合理的方式吗?对于我已经阅读过Raknet如何处理其内容的内容,它可以实现在需要更新对象时希望调用的特定方法。

如果您处理的所有数据都是原始类型,我可以看到这个工作效率可能不高。但是其他课程呢?期望API上的用户在他们自己的类中调用上述方法是否合理?如果他们使用的标准数据结构没有覆盖该方法,那该怎么办呢?

我知道有像WCF这样的东西为你做这件事,但我真的想实现我自己的解决方案,即使它不像WCF那样最佳。

感谢SO用户的任何建议! :)

1 个答案:

答案 0 :(得分:1)

尝试使用标准的.NET序列化方法将对象转换为字符串(或某些二进制blob),请参阅an article here

我不会在每个属性设置器上调用Update,因为如果该对象具有许多属性并且用户将更改其中的几个,则会有不必要的网络传输,并且速度很慢。相反,用户应该调用BeginUpdate和FinishUpdate之类的方法,这可以嵌套(所以我会创建一个嵌套计数器)。调用最外层的FinishUpdate时,可以在网络上同步它们。 Setter可以检查是否调用了BeginUpdate(嵌套计数器大于零),如果没有,则在这种情况下抛出异常。您甚至可以创建在创建时调用BeginUpdate和在Dispose上调用FinishUpdate的一次性对象,这样您就可以编写:

using (var ut = new UpdateTransaction(myObject))
// UpdateTransaction constructor calls myObject.BeginUpdate
{
    myObject.MyProp = 5;
    // ...
}
// at the end of using clause Dispose is called,
// which in turn calls myObject.FinishUpdate  

如果您有复杂的对象集,那么您需要创建一个表示该对象集的类并将它们全部存储在列表中。然后应该为此类实现BeginUpdate / FinishUpdate,而不是针对单个对象。