Метод Silverlight Socket.ConnectAsync никогда не вызывает событие Completed - PullRequest
1 голос
/ 03 ноября 2010

Метод Socket.ConnectAsync Silverlight никогда не вызывает событие Completed - я использую 127.0.0.1:4510. Я настроил IIS для обслуживания файла clientaccesspolicy.xml на порту 943.

Я использую следующий код:

        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 ]

1 голос
/ 07 июня 2011

У меня была похожая проблема, которую я только что решил;Я видел ваш пост, когда искал ответы, и думал, что лучше поделюсь им, хотя это старый пост.Даже если вы давно обойдете эту проблему, другие найдут этот пост.

Я думал, что мой обработчик событий тоже не запускается.Оказалось, что это БЫЛО, но оно было запущено в фоновом потоке и не могло повлиять на пользовательский интерфейс.Решением было убедиться, что обработчик запустил поток пользовательского интерфейса.Используйте CheckAccess и, если его нет в основном потоке, отправьте его туда с помощью Dispatcher.BeginInvoke.

Надеюсь, это поможет!

0 голосов
/ 28 ноября 2013

API асинхронного сокета Silverlight (единственный доступный) очень плох.В вашем случае, если значение, возвращаемое из 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...