我在客户端用单线程接收到服务器端多线程传输过来的数据,将数据转换为类放到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秒。。
都无语了,用了多线程比单线程的速度还慢。。
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秒。。
都无语了,用了多线程比单线程的速度还慢。。
你的意思是客户端在发送请求的时候就发送多个socket去和服务器去对应?
如果你客户端就用多线程开多个Socket去服务器取数据,那么你就可以人为将文件分段,每个线程负责一个段的写入,这样对于每个线程,都不需要反复Seek,可以连续写入数据了。
难道是加上锁?可加上锁后,不也是要1个个的写入吗?