.Net async Socket многопоточная отправка - PullRequest
0 голосов
/ 04 июля 2010

У меня есть сокет, который я использую для отправки больших буферов, если я что-то сделаю, как

// may be accsed form a a lot of threads
void Send(byte[] buffer)
{
  m_socket.BeginSend(buffer ... , SendCallback);
}

void SendCallback()
{
  m_socket.EndSend()

  // if not done sending- send the reset
  m_socket.BeginSend()
}

Мой вопрос: это будет работать с точки зрения многопоточности, или буферы будут чередоваться?1004 *

Ответы [ 2 ]

1 голос
/ 04 июля 2010

Похоже, что это потокобезопасно.

Поскольку ваш делегат "SendCallback" выполняется в новом потоке, я бы предположил, что EndSend () может сказать, какую асинхронную операцию вы завершаете, основываясь на текущем контексте потока.

См.MSDN "Best Practices" для модели асинхронного программирования:

Simultaneously Executing Operations

If your class supports multiple concurrent invocations, enable the developer to track each invocation separately by defining the MethodNameAsync overload that takes an object-valued state parameter, or task ID, called userSuppliedState. This parameter should always be the last parameter in the MethodNameAsync method's signature.

http://msdn.microsoft.com/en-us/library/ms228974.aspx

0 голосов
/ 04 июля 2010

Цитирование MSDN:

Если вы выполняете несколько асинхронных операции над сокетом, они не обязательно завершить в порядке в которых они запущены.

Но если вы отправляете блоки данных из нескольких потоков, каково ваше определение «порядка» в любом случае?

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