ChangeBatchBase.AddChange 方法

将指定的项变更添加到当前打开的组

命名空间: Microsoft.Synchronization
程序集: Microsoft.Synchronization(在 microsoft.synchronization.dll 中)

语法

声明
Public Sub AddChange ( _
    change As ItemChange _
)
用法
Dim instance As ChangeBatchBase
Dim change As ItemChange

instance.AddChange(change)
public void AddChange (
    ItemChange change
)
public:
void AddChange (
    ItemChange^ change
)
public void AddChange (
    ItemChange change
)
public function AddChange (
    change : ItemChange
)

参数

  • change
    要添加到当前打开的组的项变更。

异常

异常类型 条件

ChangeBatchIsReadOnlyException

已将变更批发送至变更应用方或同步会话。变更批发送后,不能向其添加变更。

备注

在项变更可以添加到 ChangeBatchBase 对象之前,必须通过调用 ChangeBatch 对象的 BeginOrderedGroupBeginUnorderedGroup 方法来打开组。否则,此方法将引发 InvalidOperationException

示例

下面的示例通过向变更批中的有序组添加项来实现 GetChangeBatch。仅当项的变更版本不包含在目标知识中时,才会添加项。

Public Overrides Function GetChangeBatch(ByVal batchSize As UInteger, ByVal destinationKnowledge As SyncKnowledge) As ChangeBatch
    ' The destination knowledge must be converted to be compatible with the source replica
    ' before it can be used.
    Dim mappedDestKnowledge As SyncKnowledge = _knowledge.MapRemoteKnowledgeToLocal(destinationKnowledge)

    ' Create a new change batch, initialized by using the current knowledge of the source replica
    ' and a new ForgottenKnowledge object.
    Dim changeBatch As New ChangeBatch(IdFormats, GetKnowledge(), New ForgottenKnowledge())

    ' Start a group of changes in the change batch. The group is ordered by item ID.
    ' _getChangeBatchCurrent is 0 the first time GetChangeBatch is called, and is used to track the
    ' position in the metadata store for subsequent calls to GetChangeBatch.
    changeBatch.BeginOrderedGroup(_items.Values(_getChangeBatchCurrent).GlobalId)

    ' itemsAdded is incremented each time a change is added to the change batch. When itemsAdded
    ' is greater than the requested batch size, enumeration stops and the change batch is returned.
    Dim itemsAdded As Integer = 0

    Dim itemMeta As ItemMetadata

    ' Enumerate items and add a change to the change batch if it is not contained in the 
    ' destination knowledge.
    ' _items is a SortedList that contains ItemMetadata objects that are ordered by item ID.
    While itemsAdded <= batchSize AndAlso _getChangeBatchCurrent < _items.Count
        itemMeta = _items.Values(_getChangeBatchCurrent)
        Dim kind As ChangeKind = If((itemMeta.IsDeleted), ChangeKind.Deleted, ChangeKind.Update)
        Dim change As New ItemChange(IdFormats, ReplicaId, itemMeta.GlobalId, kind, itemMeta.CreationVersion, itemMeta.ChangeVersion)

        ' If the change is not contained in the destination knowledge, add it to the change batch.
        If Not mappedDestKnowledge.Contains(change) Then
            changeBatch.AddChange(change)
            itemsAdded += 1
        End If
        _getChangeBatchCurrent += 1
    End While

    ' End the group of changes in the change batch. Pass the current source knowledge.
    changeBatch.EndOrderedGroup(_items.Values(_getChangeBatchCurrent - 1).GlobalId, _knowledge)

    ' When all items in the metadata store have been enumerated, set this batch as the
    ' last batch.
    If _getChangeBatchCurrent = _items.Count Then
        changeBatch.SetLastBatch()
    End If

    Return changeBatch
End Function
public override ChangeBatch GetChangeBatch(uint batchSize, SyncKnowledge destinationKnowledge)
{
    // The destination knowledge must be converted to be compatible with the source replica
    // before it can be used.
    SyncKnowledge mappedDestKnowledge = _knowledge.MapRemoteKnowledgeToLocal(destinationKnowledge);

    // Create a new change batch, initialized by using the current knowledge of the source replica
    // and a new ForgottenKnowledge object.
    ChangeBatch changeBatch = new ChangeBatch(IdFormats, GetKnowledge(), new ForgottenKnowledge());

    // Start a group of changes in the change batch. The group is ordered by item ID.
    // _getChangeBatchCurrent is 0 the first time GetChangeBatch is called, and is used to track the
    // position in the metadata store for subsequent calls to GetChangeBatch.
    changeBatch.BeginOrderedGroup(_items.Values[_getChangeBatchCurrent].GlobalId);
    
    // itemsAdded is incremented each time a change is added to the change batch. When itemsAdded
    // is greater than the requested batch size, enumeration stops and the change batch is returned.
    int itemsAdded = 0;
    
    ItemMetadata itemMeta;

    // Enumerate items and add a change to the change batch if it is not contained in the 
    // destination knowledge.
    // _items is a SortedList that contains ItemMetadata objects that are ordered by item ID.
    for (; itemsAdded <= batchSize && _getChangeBatchCurrent < _items.Count; _getChangeBatchCurrent++)
    {
        itemMeta = _items.Values[_getChangeBatchCurrent];
        ChangeKind kind = (itemMeta.IsDeleted) ? ChangeKind.Deleted : ChangeKind.Update;
        ItemChange change = new ItemChange(IdFormats, ReplicaId, itemMeta.GlobalId, kind, itemMeta.CreationVersion, 
            itemMeta.ChangeVersion);

        // If the change is not contained in the destination knowledge, add it to the change batch.
        if (!mappedDestKnowledge.Contains(change))
        {
            changeBatch.AddChange(change);
            itemsAdded++;
        }
    }

    // End the group of changes in the change batch. Pass the current source knowledge.
    changeBatch.EndOrderedGroup(_items.Values[_getChangeBatchCurrent - 1].GlobalId, _knowledge);

    // When all items in the metadata store have been enumerated, set this batch as the
    // last batch.
    if (_getChangeBatchCurrent == _items.Count)
    {
        changeBatch.SetLastBatch();
    }

    return changeBatch;
}

请参阅

参考

ChangeBatchBase 类
ChangeBatchBase 成员
Microsoft.Synchronization 命名空间