Silverlight Socket.ConnectAsync方法从不调用Completed事件

时间:2010-11-03 09:57:08

标签: silverlight sockets

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调用没有死锁。

2 个答案:

答案 0 :(得分:1)

我有一个类似的问题,我刚才解决了;我在寻找答案时看到了你的帖子,并认为我最好分享,即使这是一个老帖子。即使你已经过了这个问题,其他人也会发现这个帖子。

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

希望这有帮助!

答案 1 :(得分:0)

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;
    }