Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / C#

Microsoft Sync Framework

4.77/5 (17 votes)
31 Oct 2011CPOL1 min read 56.4K  
One of the most interesting problems in the distributed world is managing and synchronizing changes in data elements on various endpoints.

I work for Microsoft in the Windows Live division as a Software Design Engineer. One of the most interesting problems in the distributed world is managing and synchronizing changes in data elements on various endpoints. Microsoft released a CTP of its sync framework that is out for pre RTM preview (Read this). The API consists of three major components:

  • Sync runtime - This is the actual sync runtime that performs transfer of knowledge and metadata and performs actual synchronization. This is the actual underlying sync engine.
  • Metadata store - Keeps track of metadata of elements at a given endpoint. The API includes a SQL CE implementation of metadata store that can be used out of the box. This component can be customized to address a specific solution.
  • Providers - The actual storage provider for elements. The API includes the filesystem and RSS providers out of the box. This again can be customized and custom providers can be plugged into the sync framework.

Customization of metadata store and providers is interesting as it can be utilized in providing sync solutions that operate on differential data sync algorithms.

Following is an example of file syncing between two file system providers. The example utilizes CTP2 of Microsoft Sync Framework (Read this).

C#
using System;
using System.IO;
using Microsoft.Synchronization;
using Microsoft.Synchronization.Files;
namespace MySamples.FileSystemSync
{
class Program
{
    // Folders to be synced
    static string folderA = Environment.CurrentDirectory + "\\A";
    static string folderB = Environment.CurrentDirectory + "\\B";
    static void Main(string[] args)
    {
        // Prepare directories for syncing
        PrepareDirectory(folderA);
        PrepareDirectory(folderB);

        // Create file system provider
        FileSyncProvider providerA = new FileSyncProvider(Guid.NewGuid(), folderA);
        FileSyncProvider providerB = new FileSyncProvider(Guid.NewGuid(), folderB);

        // Create a file in folders
        File.WriteAllText(Path.Combine(folderA, "A.txt"), 
                          "This file is created by A");
        File.WriteAllText(Path.Combine(folderB, "B.txt"), 
                          "This file is created by B");

        // Ask providers to detect changes
        providerA.DetectChanges();
        providerB.DetectChanges();

        // Sync changes
        SyncOrchestrator agent = new SyncOrchestrator();
        agent.LocalProvider = providerA;
        agent.RemoteProvider = providerB;
        agent.Direction = SyncDirectionOrder.UploadAndDownload;
        agent.Synchronize();
    }

    static void PrepareDirectory(string directoryName)
    {
        if (Directory.Exists(directoryName))
        {
            Directory.Delete(directoryName, true);
        }
        Directory.CreateDirectory(directoryName);
    }
}
}

At the end of running the sample, notice how both folders A and B have A.txt and B.txt.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)