C# 双工WCF通信不';t在地铁应用中的应用

C# 双工WCF通信不';t在地铁应用中的应用,c#,.net,wcf,microsoft-metro,C#,.net,Wcf,Microsoft Metro,您能告诉我为什么在我的Metro应用程序中使用TcpTransportBindingElement的双工通信不起作用吗 根据文档,.Net Framework的Metro子集支持TCP绑定 所以我编写了WCF服务器作为控制台应用程序。以下是源代码: static void Main() { UiWcfSession.OnInitialize += ClientInitialize; var baseAddresses = new Uri("net.tcp://localhost

您能告诉我为什么在我的Metro应用程序中使用TcpTransportBindingElement的双工通信不起作用吗

根据文档,.Net Framework的Metro子集支持TCP绑定

所以我编写了WCF服务器作为控制台应用程序。以下是源代码:

static void Main()
{
    UiWcfSession.OnInitialize += ClientInitialize;

    var baseAddresses = new Uri("net.tcp://localhost:9000/");

    var host = new ServiceHost(typeof(UiWcfSession), baseAddresses);

    var reliableSession = new ReliableSessionBindingElement { Ordered = true, InactivityTimeout = TimeSpan.MaxValue };
    var binding =
        new CustomBinding(reliableSession, new TcpTransportBindingElement()) { ReceiveTimeout = TimeSpan.MaxValue };

    host.AddServiceEndpoint(typeof(IClientFulfillmentPipeService), binding, "");

    var metadataBehavior = new ServiceMetadataBehavior();
    host.Description.Behaviors.Add(metadataBehavior);
    var mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
    host.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "mex");

    host.Open();

    Thread.CurrentThread.Join();
}

private static void ClientInitialize(int uiprocessid, string key)
{
    Debug.WriteLine("ClientInitialize");
}
下面是Metro应用程序中的客户端代码:

partial class MainPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private void onclick(object sender, RoutedEventArgs e)
    {
        try
        {
            var ep = new EndpointAddress("net.tcp://localhost:9000/");
            var binding = new CustomBinding(new TcpTransportBindingElement());
            var ctx = new InstanceContext(new Wrapper());
            var pipeFactory = new DuplexChannelFactory<IClientFulfillmentPipeService>(ctx, binding, ep);
            IClientFulfillmentPipeService commChannel = pipeFactory.CreateChannel();

            // open up the the comm channel with a reasonable timeout...
            ((IChannel)commChannel).Open();

            commChannel.Initialize(1234, "Test");

            ((IChannel)commChannel).Close();
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }
}
部分类主页
{
公共主页()
{
初始化组件();
}
private void onclick(对象发送方,RoutedEventArgs e)
{
尝试
{
var ep=新的端点地址(“net。tcp://localhost:9000/");
var binding=new CustomBinding(new tcptTransportBindingElement());
var ctx=newinstancecontext(newwrapper());
var pipeFactory=新的双工通道工厂(ctx、绑定、ep);
IClientFulfillmentPipeService commChannel=pipeFactory.CreateChannel();
//以合理的超时时间打开通信通道。。。
((IChannel)commChannel.Open();
通信信道初始化(1234,“测试”);
((IChannel)commChannel.Close();
}
捕获(例外情况除外)
{
Debug.WriteLine(例如消息);
}
}
}
所以它有点起作用了。但当我在Metro应用程序中的调试器中一步一步地运行时,它会挂起,并且永远不会从函数
commChannel.Initialize
返回


为什么会这样?我缺少什么?

原来我不能在Metro中使用同步客户端。我必须使用异步调用。这就是它不起作用的原因