WCF服务10s呼叫同步

时间:2013-12-16 15:08:57

标签: c# multithreading wcf synchronization microsoft-sync-framework

我正在使用Microsoft Sync Framework,并且每隔10秒就通过WCF服务进行同步。在某些系统上,我遇到了奇怪的SemaphoreFullExceptions,所以我试图重构这个同步背景线程。 基本上我的问题是:更喜欢什么方法:

private void SynchronizedWorker()
    {
        // Sync loop
        while (!_shouldStop)
        {
            using (var conn = new SqlConnection())
            {
                SyncOrchestrator orchestrator = new SyncOrchestrator();
                SqlSyncProviderProxy destinationProvider = new SqlSyncProviderProxy("TEST");
                SqlSyncProvider localProvider = new SqlSyncProvider("TEST", conn);
                // Set Providers
                orchestrator.LocalProvider = localProvider;
                orchestrator.RemoteProvider = destinationProvider;
                // Direction
                orchestrator.Direction = SyncDirectionOrder.UploadAndDownload;


                // Sync
                orchestrator.Synchronize();
            }


            // wait for next interval or being woken up
            if (_syncWaitEvent.WaitOne(10000))
            {
                // we have been signaled prior to the timeout expiring
                _syncForce = false;
            }
        }
    }

或者

SqlConnection conn;
    SyncOrchestrator orchestrator = new SyncOrchestrator();
    SqlSyncProviderProxy destinationProvider = new SqlSyncProviderProxy("TEST");
    SqlSyncProvider localProvider = new SqlSyncProvider("TEST", conn);

    private void SynchronizedWorker2()
    {
        conn = new SqlConnection();
        orchestrator = new SyncOrchestrator();
        destinationProvider = new SqlSyncProviderProxy("TEST");
        localProvider = new SqlSyncProvider("TEST", conn);
        // Set Providers
        orchestrator.LocalProvider = localProvider;
        orchestrator.RemoteProvider = destinationProvider;
        // Direction
        orchestrator.Direction = SyncDirectionOrder.UploadAndDownload;

        // Sync loop
        while (!_shouldStop)
        {
            // Sync
            orchestrator.Synchronize();

            // wait for next interval or being woken up
            if (_syncWaitEvent.WaitOne(10000))
            {
                // we have been signaled prior to the timeout expiring
                _syncForce = false;
            }
        }
    }

为我创建每个同步的新对象似乎是更清洁的方法。但当然它的成本会略高一些。

您怎么看?

1 个答案:

答案 0 :(得分:0)

我所做的是使用相同的Orchestrator进行同步,但在两种情况下我处理对象(并在需要时重新创建):

  • 发生错误
  • 正在退出申请

认为这是要走的路......

相关问题