在不使用多个线程的情况下从Streams快速读取()数据的方法

时间:2011-05-23 03:58:02

标签: c# performance

我正在研究用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属性,该属性返回接收缓冲区中的数据量。

1 个答案:

答案 0 :(得分:3)

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

顺便说一下,Array.Resize是可怕的...那很可能会做一个你不想做的memcopy,除非你必须这样做。相反,你应该读入一个固定大小的缓冲区,并具有处理更高级别的片段或短消息的逻辑。