Начните получать в отдельной теме - PullRequest
1 голос
/ 20 декабря 2010

По какой-то причине мне нужно выполнить BeginReceive в отдельном потоке, очень похоже на этот пример:

    public void WaitForData()
    {
        Thread t = new Thread(WaitForDataThread);
        t.Start();
    }

    public void WaitForDataThread()
    {
        try
        {
            CSocketPacket theSocPkt = new CSocketPacket();
            theSocPkt.thisSocket = m_socClient;
            m_asynResult = m_socClient.BeginReceive(theSocPkt.dataBuffer, 0, theSocPkt.dataBuffer.Length, SocketFlags.None, OnDataReceived, theSocPkt);
        }
        catch (SocketException se)
        {
            MessageBox.Show(se.Message);
        }
    }

Но я всегда получаю сообщение об ошибке сразу после вызова BeginReceive, OnDataReceived мгновенно вызывается,в этом случае он вызовет метод EndReceive, и всегда выдается эта ошибка: «Операция ввода-вывода была прервана из-за выхода из потока или запроса приложения».

Но если я удалю отдельнуючасть с резьбой (например, прямой вызов WaitForDataThread (), без использования метода WaitForData ()), все работает нормально.

Если вам интересно, зачем мне нужно создавать отдельный поток, это потому, что янеобходимо вызвать BeginReceive во время события, которое будет сгенерировано из другого потока из другого класса.Это почти то же самое, что создать новый поток, как в примере выше, и мне нужно, чтобы он работал.

Есть ли способ, которым я могу это сделать ??

Ответы [ 2 ]

2 голосов
/ 20 декабря 2010

Найден ответ на msdn (документация Socket.EndReceive):

Все операции ввода-вывода, инициированные данным потоком, отменяются при выходе из этого потока.Ожидание асинхронной операции может завершиться неудачей, если поток завершается до завершения операции.

Вы должны убедиться, что ваш поток, с которого вы запускаете операцию с сокетом, не завершится, пока вы не закончили работу с сокетом.I / O.

Обходной путь должен использовать поток пула потоков, как описано здесь .

1 голос
/ 20 декабря 2010

Я предполагаю, что ваш основной поток не ждет, пока данные поступят, а просто завершает работу после порождения другого потока. Завершение основного потока уничтожает все приложение, поэтому ваш поток WaitForData тоже умирает.

Вы должны сделать следующее:

  1. Запуск потока WaitForData
  2. Делай что хочешь в главной теме
  3. Дождаться окончания потока WaitForData в главном потоке (Thread.Join?)
  4. Затем выйдите.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...