【问题标题】:WCF nested CallbackWCF 嵌套回调
【发布时间】:2009-06-13 02:55:14
【问题描述】:

背景:我正在尝试将由 ADO 1.0 DBServerSyncProvider 的同步服务触发的服务器端 ApplyChangeFailed 事件转发到客户端。 Sync Services冲突解决的所有代码示例都没有使用WCF,当客户端直接连接到服务器数据库时,不存在这个问题。但是,我的 DBServerSyncProvider 由无头 WCF 服务包装,我无法向用户显示包含违规数据的对话框以供查看。

所以,显而易见的解决方案似乎是将 Sync Services 生成的 HTTP WCF 服务转换为 TCP,使其成为双工连接,并在接收 SyncConflict 对象并设置 Action 属性的客户端上定义一个回调处理程序事件。

当我这样做时,我收到了一个运行时错误(在尝试回调之前):

System.InvalidOperationException:此操作会死锁,因为 在当前消息完成处理之前无法收到回复。如果 你想允许乱序消息处理,指定 ConcurrencyMode CallbackBehaviorAttribute 上可重入或多重。

所以我按照消息的建议做了,并使用 Multiple 属性修饰了服务和回调行为。然后运行时错误消失了,但调用导致“死锁”并且永远不会返回。我该怎么做才能解决这个问题?是不是不能有一个WCF服务在原始服务调用返回之前回调客户端?

编辑:我认为this 可能是问题的解释,但我仍然不确定正确的解决方案应该是什么。

【问题讨论】:

    标签: wcf callback duplex reentrancy


    【解决方案1】:

    更新 ConcurrencyMode 后,您是否尝试过在单独的线程中触发回调?

    This answer 到另一个问题有一些示例代码启动另一个线程并通过回调,您也许可以根据您的目的修改该设计?

    【讨论】:

    • 在考虑了更多之后,我意识到我帖子中链接背后的线程对这个问题有很好的推理。问题不在于必须在单独的线程中进行回调。由于它在服务器上运行,因此不相关。死锁发生在客户端。我会用我的代码发布答案。
    【解决方案2】:

    通过在客户端的单独线程中启动同步代理,回调可以正常工作:

        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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-21
      相关资源
      最近更新 更多