【问题标题】:c# asynchronous socket accessed by multiple threadsc# 多线程访问的异步socket
【发布时间】:2011-09-16 13:48:51
【问题描述】:

我想为我的套接字使用 C# 异步 io 模型。我有多个 需要通过套接字发送的线程。处理此问题的最佳方法是什么? 一个由 N 个套接字组成的池,访问由锁控制?或者是异步发送线程安全的 多个线程访问单个套接字?

谢谢!

杰克

【问题讨论】:

  • albahari.com/threading 在尝试找到最佳线程解决方案时很容易阅读。
  • 您有需要遵守的协议吗?流必须按顺序传输吗?
  • 谢谢,帕特里克。阿尔巴哈里看起来确实很有用。我正在使用套接字在远程服务器上设置和获取值。我正在研究异步套接字 io,但我知道它使用系统线程池。所以,我
  • 可能有SET后跟GET的情况,GET先于SET处理,所以GET返回旧值。如果 SET 和 GET 由两个不同的线程处理,并且第二个线程比第一个更快,则可能会发生这种情况。

标签: c# multithreading sockets asynchronous thread-safety


【解决方案1】:

异步方法已经创建了新线程来发送数据。这可能会给您的应用程序增加不必要的开销。如果您已经有多个线程,您可以创建一个 IDispoable 类型的对象来表示对套接字的访问和一个管理器,它将控制套接字的签入和签出。调用 IDisposable dispose 方法时,套接字将自行检查。这样,您也可以控制线程可以在套接字上执行的方法。 如果套接字已经被另一个线程签出,管理器会简单地阻塞直到它可用。

using (SharedSocket socket = SocketManager.GetSocket())
{
    //do things with socket
}

【讨论】:

  • 谢谢,好主意。我已经有类似的东西了。我只是担心随着调用线程的增长,这不会很好地扩展。他们可能会花费大量时间进行屏蔽。
  • 如果线程只写socket,可以使用队列将要写入的数据放入socket,让另一个线程消费数据。这样调用线程根本不需要阻塞。
  • 谢谢。会试试看。我也想使用多核,所以我可能会运行几个这样的队列套接字。
【解决方案2】:

System.Threading.Semaphore 在同步和比赛条件下变得很方便

【讨论】:

    猜你喜欢
    • 2015-06-02
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多