다음을 통해 공유


ChangeBatchBase.AddChange 메서드

지정된 항목 변경 내용을 현재 열려 있는 그룹에 추가합니다.

네임스페이스: Microsoft.Synchronization
어셈블리: microsoft.synchronization.dll의 Microsoft.Synchronization

구문

‘선언
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 개체의 BeginOrderedGroup 또는 BeginUnorderedGroup 메서드를 호출하여 그룹을 열어야 합니다. 그렇지 않으면 이 메서드는 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 네임스페이스