我有一个套接字,我用来发送大缓冲区,如果生病了就像
那样// 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()
}
我的问题是:这会从多线程的角度来看,还是缓冲区会交错?
答案 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.
答案 1 :(得分:0)
引用MSDN:
如果执行多个异步操作 在套接字上的操作,他们没有 必须按顺序完成 他们开始了。
但是如果您从多个线程发送数据块,那么您对“订单”的定义是什么?