C#高级编程:双工通信实现与死锁避免

需积分: 14 44 下载量 36 浏览量 更新于2024-08-05 收藏 97.07MB PDF 举报
"双工通信-hta8533-md-007yy_使用说明书_v1.1_20170302" 本文档介绍的是如何在C#环境中实现双工通信,特别是在Windows Communication Foundation (WCF)服务中。双工通信允许服务端与客户端之间的双向通信,即服务可以主动调用客户端的方法,而不仅仅是客户端调用服务。 在双工通信中,客户端需要定义一个回调接口,例如`IMyMessageCallback`,其中包含服务将调用的方法。在这个例子中,回调方法`onCallback(string message)`被标记为`IsOneWay=true`,这意味着服务调用这个方法时不会等待客户端的响应,这适用于不需要返回值的情况。 服务协定`IMyMessage`定义了服务提供给客户端调用的方法,如`MessageToServer(string message)`。回调协定通过`CallbackContract`属性与服务协定关联。 在代码实现中,`MessageService`类实现了`IMyMessage`接口,当接收到客户端的消息时,它会在控制台上打印出来。为了调用客户端的回调方法,服务使用`OperationContext.Current`获取与当前请求相关的`OperationContext`,然后通过`GetCallbackChannel<T>`方法获取客户端的回调信道,并通过这个信道调用`onCallback`方法来发送消息回客户端。 在处理回调时,为了避免出现死锁,需要注意服务的并发模式设置。默认情况下,服务的行为(`ConcurrencyMode`)是`Single`,意味着服务实例只能在一个线程中运行。如果服务尝试回调并等待客户端的响应,而客户端又试图调用服务,就会发生死锁。为了避免这种情况,可以将并发模式设置为`Reentrant`,允许服务在回调时重入,或者设置为`Multiple`,允许多个线程同时访问服务实例,但这需要自定义锁定机制。 双工通信在WCF中需要正确配置服务协定、回调接口以及并发模式,以确保客户端和服务之间的顺畅通信。理解并正确使用这些概念是C#高级编程中的重要部分,特别是对于开发实时交互的应用程序来说。