【发布时间】:2012-07-23 19:38:44
【问题描述】:
我最初在发送数据时遇到了竞争条件,问题是我允许使用多个 SocketAsyncEventArgs 来发送数据,但是第一个数据包在第二个数据包之前没有完全发送,这是因为我有它所以如果数据不适合缓冲区,它会循环直到所有数据都发送完毕,并且第一个数据包比第二个数据包大,第二个数据包很小,所以第二个数据包在第一个数据包之前被发送并到达客户端。
我已经解决了这个问题,将 1 个 SocketAyncEventArgs 分配给一个打开的连接以用于发送数据,并使用信号量来限制对它的访问,并在完成后让 SocketAsyncEventArgs 回调。
现在这工作正常,因为所有数据都已发送,并在完成下一次发送准备好时回调。这个问题是,当我想随机发送数据到打开的连接时,它会导致阻塞,当有大量数据发送时,它会阻塞我的线程。
我正在寻找解决此问题的方法,我想有一个队列,当请求发送数据时,它只是将数据包添加到队列中,然后 1 SocketAsyncEventArgs 简单地循环发送该数据。
但是我怎样才能在保持可扩展性的同时高效地做到这一点?在按照请求发送的顺序发送数据包时,我想尽可能避免阻塞。
感谢任何帮助!
【问题讨论】:
标签: c# .net sockets packets socketasynceventargs