【问题标题】:.Net async Socket multi-threaded sending.Net async Socket 多线程发送
【发布时间】:2010-07-04 09:34:37
【问题描述】:

我有一个套接字,我用它来发送大缓冲区,如果我不这样做的话

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

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

【问题讨论】:

  • 您能更清楚地了解您正在使用的 API 吗?我没有看到与您的调用匹配的 Socket.Send() 重载。
  • 抱歉函数名有误,我已编辑。我正在使用:public IAsyncResult BeginSend(byte[] buffer, int offset, int size, SocketFlags socketFlags, AsyncCallback callback, object state);

标签: c# .net multithreading sockets networking


【解决方案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

【讨论】:

    【解决方案2】:

    引用 MSDN:

    如果你执行多个异步 套接字上的操作,它们不会 必须按顺序完成 它们被启动了。

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

    【讨论】:

    • 如果我必须要消息:“aaaa”和“bbbb”,我不会让接收者得到:“aaaabbbb”或“bbbbaaaa”,但如果套接字的发送缓冲区有 2 个字节大,则不是“aabbaabb” .
    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多