C# WCF服务10s呼叫进行同步

C# WCF服务10s呼叫进行同步,c#,multithreading,wcf,synchronization,microsoft-sync-framework,C#,Multithreading,Wcf,Synchronization,Microsoft Sync Framework,我使用的是Microsoft Sync Framework,每10秒通过WCF服务进行一次同步。在某些系统上,我遇到了奇怪的信号量lexceptions,所以我试图重构这个同步后台线程。 基本上,我的问题是:选择哪种方法: private void SynchronizedWorker() { // Sync loop while (!_shouldStop) { using (var conn = new SqlC

我使用的是Microsoft Sync Framework,每10秒通过WCF服务进行一次同步。在某些系统上,我遇到了奇怪的信号量lexceptions,所以我试图重构这个同步后台线程。 基本上,我的问题是:选择哪种方法:

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;
            }
        }
    }
为我的每次同步创建新对象似乎是更干净的方法。但当然,它需要稍微多一些cpu时间


您认为呢?

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

  • 发生了一个错误
  • 应用程序正在退出

我认为这是一种方法…

我从未使用过“同步”,但如果这些对象实现IDisposable,那么我强烈建议将它们保留在局部变量中,并使用块实现
。SyncOrchestrator不实现IDisposable,但提供程序实现。但是,由于我使用会话与WCF通信,我可能会让提供者尽可能长时间地保持开放,因为安全协商可能会耗费大量成本。