.Net async Socket多线程发送

时间:2010-07-04 09:34:38

标签: c# .net multithreading sockets networking

我有一个套接字,我用来发送大缓冲区,如果生病了就像

那样
// 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()
}

我的问题是:这会从多线程的角度来看,还是缓冲区会交错?

2 个答案:

答案 0 :(得分:1)

这似乎是线程安全的。

由于您在新线程上执行了“SendCallback”的委托,我认为EndSend()可以根据当前线程上下文判断您要结束的异步操作。

请参阅MSDN“异步编程模型的最佳实践”:

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

答案 1 :(得分:0)

引用MSDN:

  

如果执行多个异步操作   在套接字上的操作,他们没有   必须按顺序完成   他们开始了。

但是如果您从多个线程发送数据块,那么您对“订单”的定义是什么?