WCF嵌套回调

时间:2009-06-13 02:55:15

标签: wcf callback duplex reentrancy

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

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

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

  

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

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

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

2 个答案:

答案 0 :(得分:1)

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

This answer另一个问题有一些示例代码启动另一个线程并通过回调,你可能能够为你的目的修改那个设计吗?

答案 1 :(得分: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();
    }
}