一种从Streams读取()数据的快速方法,无需使用多个线程

本文关键字:线程 方法 一种 Streams 数据 读取 | 更新日期: 2023-09-27 17:57:27

我正在开发一个用C#编写的在线FPS,它将使用P2P将玩家连接在一起,而不是使用集中式服务器。我需要一种快速的方法来读取每个流中的数据,然后在收到数据包时通知游戏。

class StreamReader 
{
    List<XStream> streams;
    onPeerFound(XStream stream) {
        System.Threading.Thread mthread = new System.Threading.Thread(targetthread);
        mthread.start(stream);
    }
    void targetthread(object sender) {
        XStream mstream = (XStream)sender;
        while(isrunning) {
            byte[] buffer = new byte[4086];
            Array.Resize<byte>(ref buffer,mstream.Read(buffer,0,4086));
            onPacketReceived.Invoke(buffer,mstream.remoteID);
        }
    }
}

有没有一种更快的方法可以做到这一点,而无需为每个流创建单独的线程?请注意,每个XStream还有一个DataAvailable属性,它返回接收缓冲区中的数据量。

一种从Streams读取()数据的快速方法,无需使用多个线程

使用异步IO?调用BeginRead,然后在线程池线程上获得回调,而不是Read。它仍然是线程化的,但您不必管理线程,而且它通常比每个请求的线程更高效。

那个数组。顺便说一下,调整大小很可怕。。。这很可能会做一个memcopy,除非迫不得已,否则你不想做。相反,你应该读取一个固定大小的缓冲区,并拥有在更高级别处理碎片或短消息的逻辑。