2010-07-04 123 views
0

我使用通过发送大量的缓冲区有一个插座,即时通讯,如果生病做类似净异步的Socket多线程发送

// 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

你能对你正在使用的API更清晰?我没有看到与您的调用相匹配的Socket.Send()重载。 – 2010-07-04 09:47:31

+0

对不起,函数名称错误,编辑过。 im使用: \t \t public IAsyncResult BeginSend(byte [] buffer,int offset,int size,SocketFlags socketFlags,AsyncCallback callback,object state); – 2010-07-04 09:59:52

回答

0

引述MSDN:

如果一个套接字执行多个异步 操作,他们没有 在它们开始在 的顺序不一定完整。

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

+1

如果我有消息:“aaaa”和“bbbb”我不会让reciver得到:“aaaabbbb”或“bbbbaaaa”,但不是“aabbaabb”,如果套接字的发送缓冲区是2个字节大。 – 2010-07-04 10:01:40

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

+0

看看我对henk的评论 – 2010-07-04 11:19:15