1

我正在使用Microsoft Sync Framework並每隔10秒在WCF服務上同步。在某些系統上,我遇到了怪異的SemaphoreFullExceptions,所以我試圖重構這個Synching Background Thread。 基本上我的問題是:什麼樣的方法更傾向於:WCF服務10s呼叫同步

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時間。

您認爲如何?

回答

0

我所做的是使用相同的Orchestrator的同步,但在兩個案例中,我處置的對象(和再造如果需要的話):

  • 發生
  • 應用程序正在退出錯誤

認爲這是要走的路...

+0

我從來沒有使用「同步」,但如果這些對象實現IDisposable,那麼我強烈建議讓他們在局部變量和implem使用''塊。 –

+0

SyncOrchestrator不實現IDisposable,但提供程序執行此操作。但是因爲我使用會話與WCF通信,所以我可能會盡可能長時間地禁止提供者,因爲安全協商可能會花費很多。 – Travis