服务合同:
[ServiceContract(CallbackContract = typeof(IClientCallBackChannel),
SessionMode = SessionMode.Required)]
public interface IServerService
{
[OperationContract(IsOneWay = true)]
void foo();
}
客户合同:
public interface IClientCallBackChannel
{
[OperationContract(IsOneWay = false)]
object DoCommand(Command command);
}
class ClientCallBackChannelImpl
{
public object DoCommand(Command command)
{
// freezes service
serverService.foo();
// OK
new Action(() =>
{
Thread.Sleep(1000);
serverService.foo();
}
).BeginInvoke(null,null);
}
}
我有一个双工服务,当我调用客户端方法'DoCommand'时,在该方法内部调用了一个Service方法foo,我的服务冻结了。 如果我异步调用foo它工作正常,但我需要调用同步。
答案 0 :(得分:1)
我认为问题是你需要DoCommand返回一个值,因此无法使其成为OneWay。如果您考虑到这一点,就必须阻止您的服务。
您可以将ServiceBehavior的ConcurrencyMode设置为多个,这应该可行,但恕我直言,这不是最佳选择。
由于您正在进行双向沟通,请尝试坚持使用OneWay-Methods - 这样可以解决问题并防止出现上述行为导致的难以解决的问题。