C # Асинхронная блокировка Socket Comms - PullRequest
0 голосов
/ 16 января 2010

У меня есть класс-оболочка для сокетов, который отправляет и получает сообщения с сервера (в частности, команды, ответы и уведомления). У меня также есть класс потребления, который сериализует команды в текст для отправки через оболочку. Моя проблема в том, что когда команда отправляется, мне нужно подождать, пока я не получу сообщение с определенным заголовком. Когда я делаю это, класс потребления блокируется, так как я использую ManualResetEvent.WaitOne, который устанавливается моим методом получения. Причина, по которой проблема заключается в том, что мои блокирующие классы потребляют, заключается в том, что тем временем может быть получено другое сообщение, и я не могу его обработать Есть ли способ заблокировать определенный объект, чтобы мой класс мог реагировать на другие события?

Способ отправки:

    _waitingCommands.Enqueue(command);
    String commandText = command.ToString();
    _socket.Send(commandText);

Способ получения:

if (response.Header.Type == Messages.MessageType.Response)
{
   if (command.Response == null)
      command.Response = response;

   _waitingCommands.Dequeue();
   command.Finished.Set();
}

1 Ответ

0 голосов
/ 16 января 2010

Используйте socket.BeginSend и socket.BeginReceive. Они будут отделять отдельные потоки, что позволит вашему основному потоку продолжить обработку. После того, как данные отправлены или получены, методы, подключенные к методу BeginSend / BeginReceive, будут запускаться в логическом порядке.

Начать отправку

BeginReceive

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...