2009-06-13 84 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