サービス契約:
[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を非同期で呼び出すと正常に機能しますが、呼び出しを同期する必要があります。