2009-06-13 66 views
0

背景:我試圖將由Sync Services for ADO 1.0 DBServerSyncProvider觸發的服務器端ApplyChangeFailed事件轉發給客戶端。 Sync Services衝突解決的所有代碼示例都不使用WCF,並且當客戶端直接連接到服務器數據庫時,此問題不存在。然而,我的DBServerSyncProvider是由無頭WCF服務包裝的,我無法向用戶顯示包含違規數據的對話框以供審閱。WCF嵌套回調

因此,顯而易見的解決方案似乎是將Sync Services生成的HTTP WCF服務轉換爲TCP,使其成爲雙工連接,並在接收SyncConflict對象的客戶端上定義回調處理程序,並設置Action屬性事件。

當我這樣做,我得到一個運行時錯誤(試圖回調前):

System.InvalidOperationException:此操作會死鎖,因爲不能接受 答覆,直到當前的消息完成處理。如果 您希望允許亂序消息處理,請在CallbackBehaviorAttribute中指定 Reentrant或Multiple的併發性模式。

所以我做了什麼消息建議和裝飾的服務和多個屬性的回調行爲。然後運行時錯誤消失了,但是調用導致「死鎖」並且從不返回。我該怎麼做才能解決這個問題?在原始服務調用返回之前是否有可能返回客戶端的WCF服務?

編輯:我認爲this可能是問題的解釋,但我仍然不知道正確的解決方案應該是什麼。

回答

0

通過在客戶端上的一個單獨的線程啓動同步代理,回調只是罰款:

private int kickOffSyncInSeparateThread() 
    { 
     SyncRunner syncRunner = new SyncRunner(); 
     Thread syncThread = new Thread(
       new ThreadStart(syncRunner.RunSyncInThread)); 

     try 
     { 
      syncThread.Start(); 
     } 
     catch (ThreadStateException ex) 
     { 
      Console.WriteLine(ex); 
      return 1; 
     } 
     catch (ThreadInterruptedException ex) 
     { 
      Console.WriteLine(ex); 
      return 2; 
     } 
     return 0; 
    } 

這是我SyncRunner:

class SyncRunner 
{ 
    public void RunSyncInThread() 
    { 
     MysyncAgent = new MySyncAgent(); 

     syncAgent.addUserIdParameter("56623239-d855-de11-8e97-0016cfe25fa3"); 
     Microsoft.Synchronization.Data.SyncStatistics syncStats = 
       syncAgent.Synchronize(); 
    } 
} 
1

在更新併發模式後,你是否嘗試在單獨的線程中觸發回調?

This answer到另一個問題有一些示例代碼,啓動另一個線程並通過回調,您可能能夠修改該設計爲您的目的?

+0

通過一些想這更多的,我意識到我帖子中的鏈接背後的線索對此問題有很好的推理。問題不在於回調必須在單獨的線程中進行。由於它在服務器上運行,因此這不相關。客戶端發生死鎖。我會用我的代碼發佈答案。 – cdonner 2009-06-15 14:08:51