【问题标题】:Silverlight Socket.ConnectAsync method never calls the Completed eventSilverlight Socket.ConnectAsync 方法从不调用 Completed 事件
【发布时间】:2013-11-28 16:20:14
【问题描述】:

Silverlight 的 Socket.ConnectAsync 方法从不调用 Completed 事件 - 我使用的是 127.0.0.1:4510 。我已将 IIS 配置为在端口 943 上提供 clientaccesspolicy.xml 文件。

我正在使用以下代码:

        SocketAsyncEventArgs args = new SocketAsyncEventArgs();

        //args.UserToken = tcp;
        args.RemoteEndPoint = ep;
        args.Completed += new EventHandler<SocketAsyncEventArgs>(OnConnect);

        mrEvent.Reset();
        bool x = tcp.ConnectAsync(args);
        mrEvent.WaitOne();

    private void OnConnect(object sender, SocketAsyncEventArgs e)
    {
        isConnected = (e.SocketError == SocketError.Success);
        mrEvent.Set();
    }

永远不会调用 OnConnect 方法,因此代码会因 WaitOne 方法而阻塞。

注意:此代码正在后台线程上执行,因此不会因 WaitOne 调用而导致死锁。

【问题讨论】:

    标签: silverlight sockets


    【解决方案1】:

    我刚刚解决了一个类似的问题;我在寻找答案时看到了你的帖子,并认为我最好分享,即使它是一个旧帖子。即使您很久没有遇到此问题,其他人也会找到此帖子。

    我认为我的事件处理程序也没有触发。原来它是 WAS,但它是在后台线程上触发的,不会影响用户界面。解决方案是确保处理程序在用户界面线程上触发。使用 CheckAccess,如果它不在主线程上,则使用 Dispatcher.BeginInvoke 将其发送到那里。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      Silverlight 异步套接字 API(唯一可用的)非常糟糕。 在您的情况下,如果从 ConnectAsync 返回的值是 false,则调用是同步的,并且不会调用 OnConnect 方法。

      这是ConnectAsync的同步版本:

          public static bool Connect(this Socket socket, EndPoint remoteAddress) {
              ManualResetEvent semaphore = new ManualResetEvent(false);
              SocketAsyncEventArgs socketEventArgs = new SocketAsyncEventArgs() {
                  RemoteEndPoint = remoteAddress
              };
              socketEventArg.SetBuffer(buffer, 0, buffer.Length);
              socketEventArg.Completed += (s, e) => {
                  semaphore.Set();
              };
              semaphore.Reset();
              bool wasAsynchronous = socket.ConnectAsync(socketEventArgs);
              if (wasAsynchronous) {
                  semaphore.WaitOne();
              }
              return socketEventArgs.SocketError == SocketError.Success;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-11
        • 2021-06-09
        • 1970-01-01
        相关资源
        最近更新 更多