繁体   English   中英

WCF:回调不是异步的

[英]WCF: Callback is not asynchronous

我正在尝试根据WCF提供的回调基础结构对客户端服务器进行编程,但是它不能异步工作。

我的客户端连接到服务器,并调用登录方法,在此我通过执行以下操作保存了客户端的回调通道

MyCallback callback = 
      OperationContext.Current.GetCallbackChannel<MyNamespace.MyCallback>()

之后,服务器进行一些处理,并使用回调对象与客户端进行通信。

所有这些工作正常,问题仍然存在于以下事实:即使我在OperationContract中将方法设置为IsOneWay=true ,但在对客户端进行调用时服务器仍然挂起。

我已经通过在Visual Studio中启动服务器进行调试,分离,启动客户端,调用上述登录方法,在客户端的已实现回调方法中设置断点以及使服务器发送响应来进行测试给客户。 服务器停止执行应做的工作,等待客户端的响应。

任何帮助表示赞赏。

诀窍是从服务器异步调用回调。 看这个:

    [OperationContract(IsOneWay = true, AsyncPattern = true)]
    IAsyncResult BeginOnMessageReceived(LiveDataMessage message, AsyncCallback acb, object state);
    void EndOnMessageReceived(IAsyncResult iar);

您是否尝试设定

[CallbackBehavior(UseSynchronizationContext = false)]

在实现回调接口的客户端对象上?

我认为解决您的问题的方法是为您的服务正确设置'ConcurecyMode'和'Instance ContextMode'属性。 为此,您必须使用以下属性装饰服务声明,如以下示例所示:

  [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)]
    public class SubscriberService: ISubscriberServiceContract
{...}

InstanceContextMode.Single将您的服务构建为Singleton对象,因此对于所有客户端,只有一个服务实例在运行;

ConcurencyMode.Reentrant或ConcurencyMode.Multiple为服务实例启用多线程工作。 对于“多个”,必须在服务中注意线程同步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM