我有一个名为“DefaultMeasurement”的MarshalByRefObject,它包含一个IPoint对象列表。
public class DefaultMeasurement : MarshalByRefObject, IMeasurement
{
private List<IPoint> iPoints;
public this[int aIndex]
{
get { return iPoints[aIndex];}
}
}
[Serializable]
public class DefaultPoint : IPoint, ISerializable
{
public int Value {get;set;}
}
首次从服务器检索DefaultMeasurement对象时,所有点都被序列化,并且在所有后续调用DefaultMeasurement.Points期间,我得到了启动客户端时正确的列表。但与此同时,该列表中至少有一个对象的状态可能已更改,并且我没有获得当前状态,尽管在服务器中状态得到更新。 如何强制更新该列表?
进一步澄清:
- 一旦我DefaultPoint : MarshalByRefObject
,它就会起作用,但这不是一种选择,因为它会对性能产生负面影响
- “更新”是指对服务器上现有对象的更改,不在列表本身上添加/删除
- 我最多可能有80k DefaultPoint
个对象
答案 0 :(得分:3)
由于你不希望Point本身成为MarshalByRef(因为如果你有大量的点,它会引入很多流量),我建议你有明确的方法来同步点值。在服务器上进行了大量更改后,可以调用SynchronizePoints()方法,该方法包括所有点的新值。现在,客户端代理具有更新状态。更好的是,首先从对象中删除状态(因为它实际上不是服务器状态的直接反映),而是使用从服务器收集点时根据需要实例化的客户端对象。
答案 1 :(得分:0)
您必须在服务器上实施a callback that notifies the client更改。
通知可以传递已更改的对象的ID,或者客户端可以请求更改的对象列表。