我在客户端用单线程接收到服务器端多线程传输过来的数据,将数据转换为类放到list<>里面,然后用foreach向流里面定位写入,但就是写入的速度太慢,有没有什么办法可以在foreach中用多线程向流中写入呢?客户端写入的代码:FileStream MyFileStream = new FileStream("D:\\new\\aaa.svd", FileMode.Create, FileAccess.Write);                List<DataModel> list = new List<DataModel>();
                while (true)
                {
                    DataModel dm = new DataModel();
                    byte[] data = CommonModule.EzoneModule.ReceiveVarData(clientsocket);
                    if (data.Length > 0)
                    {
                        //数据包的前8位是线程编号,8到40位是数据包编号,后面的才是传输的文件内容
                        byte[] head1 = new byte[8];
                        byte[] head2 = new byte[32];
                        byte[] body = new byte[data.Length - 40];
                        Array.Copy(data, head1, 8);
                        Array.Copy(data, 8, head2, 0, 32);
                        Array.Copy(data, 40, body, 0, data.Length - 40);
                        dm.Tnum = System.BitConverter.ToInt32(head1, 0);         //线程编号
                        dm.Pnum = System.BitConverter.ToInt32(head2, 0);         //数据包编号
                        dm.Data = body;                                          //数据包中的文件
                        list.Add(dm);
                    }
                    else if (data.Length == 0)
                    {
                        break;
                    }
                }
                //服务器端是用4个线程平均传送的数据包
                int sum1 = Convert.ToInt32((list.Count - 1) / 4);
                foreach (DataModel da in list)
                {
                    MyFileStream.Seek((da.Tnum * sum1 + da.Pnum) * 5000, SeekOrigin.Begin);
                    MyFileStream.Write(da.Data, 0, da.Data.Length);
                }这样写了后,测试的时候发现在局域网内传送1个119MB的文件,在服务器端用4个线程传送,在客户端用上面的代码单线程接收并写入竟然需要50秒
而将服务器端和客户端都只用单线程传输的话,就只要28秒。。
都无语了,用了多线程比单线程的速度还慢。。

解决方案 »

  1.   


    你的意思是客户端在发送请求的时候就发送多个socket去和服务器去对应?
      

  2.   

    速度的瓶颈在写文件,你的代码中是先根据线程号包号seek到要写得位置再写,这就导致硬盘磁头不断前后移动,很慢的.要想提高速度,先list中的包按照线程号包好排序, 然后依次写不要seek
      

  3.   

    请问你的数据包一般有多大,如果数据包不大的话,那么MyFileStream.Seek的次数就会很多,因为你每个数据包都需要重新Seek后再写入,这样当然会影响速度了。
    如果你客户端就用多线程开多个Socket去服务器取数据,那么你就可以人为将文件分段,每个线程负责一个段的写入,这样对于每个线程,都不需要反复Seek,可以连续写入数据了。
      

  4.   

    MyFileStream可以多线程写入的吗?不是说写入的时候必须1个个的写,不能同时写入的吗?
    难道是加上锁?可加上锁后,不也是要1个个的写入吗?
      

  5.   

    速度慢主要在写文件,不要seek到要指定位置再写,这样会很慢的.要想提高速度,就按照顺序放入list中,再统一写入。。