Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
C# 为套接字/网络连接同步对象--不使用WCF的最佳实践?_C#_Sockets_Synchronization - Fatal编程技术网

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

C# 为套接字/网络连接同步对象--不使用WCF的最佳实践?,c#,sockets,synchronization,C#,Sockets,Synchronization,通过套接字连接同步对象的好方法是什么 这是我到目前为止的想法 对象在其getter和setter中调用Update方法,该方法通过套接字连接将类的所有信息传输到其他连接的客户端。要在客户端上更新这些更改,将调用重载方法,该方法基本上解析字符串以获取其成员的值,并相应地设置它们 这样做合理吗?就我所读到的Raknet是如何工作的,它让您实现它希望在对象需要更新时调用的特定方法 我可以看到,如果您处理的所有数据都是基本类型,那么这种方法可能是无效的。但是其他课程呢?期望API上的用户在自己的类中调用

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

这是我到目前为止的想法

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

这样做合理吗?就我所读到的Raknet是如何工作的,它让您实现它希望在对象需要更新时调用的特定方法

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

我知道有些东西像WCF可以帮你做到这一点,但我真的很想实现我自己的解决方案,即使它不像WCF那样是最优的


感谢您提供的任何建议,所以用户!:)

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

我不会在每个属性设置器上调用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则应为此类而不是单个对象实现。

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

我不会在每个属性设置器上调用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应该为这个类实现,而不是为单个对象实现