C# 如何更改我的networkstream代码以将数据直接写入文件
我的代码是:C# 如何更改我的networkstream代码以将数据直接写入文件,c#,filestream,networkstream,C#,Filestream,Networkstream,我的代码是: byte[] buffer = new byte[1024]; int numberOfBytesRead = 0; MemoryStream receivedData = new MemoryStream(); do { numberOfBytesRead = serverStream.Read(buffer, 0, buffer.Length); //Read from network stream receivedData.Write(buffer, 0, numberOfB
byte[] buffer = new byte[1024];
int numberOfBytesRead = 0;
MemoryStream receivedData = new MemoryStream();
do
{
numberOfBytesRead = serverStream.Read(buffer, 0, buffer.Length); //Read from network stream
receivedData.Write(buffer, 0, numberOfBytesRead); //Write to memory stream
Thread.Sleep(1);
} while (serverStream.DataAvailable);
File.WriteAllBytes(@"C:\file.png", receivedData.ToArray());
我想把它从MemoryStream转换成FileStream,但我不知道
以及为什么我必须使用Thread.Sleep(1)
来完成文件字节的接收。有没有正确的说法代替睡眠
非常感谢转换非常简单,我假设您在如何打开文件方面遇到了问题。
文件
类提供了许多有用的实用工具方法,以及您使用的最后一种方法,如:
至于
线程.Sleep(1)
——除非我遗漏了这里没有显示的内容——它看起来像是让处理器休息的机会,但这是毫无意义的。特别是,Read
调用是IO绑定的,等待套接字(网络)提供输入,因此整个循环不太可能值得休眠。大多数对Thread.Sleep的调用本质上都是黑客行为。使用FileStream的代码:
byte[] buffer = new byte[1024];
int numberOfBytesRead = 0;
FileStream fs = new FileStream(@"C:\file.png", FileMode.Create, FileAccess.Write);
do
{
numberOfBytesRead = serverStream.Read(buffer, 0, buffer.Length); //Read from network stream
fs.Write(buffer, 0, numberOfBytesRead);
} while (serverStream.DataAvailable);
fs.Close();
你试过什么?从MemoryStream到FileStream的转换是直接进行的。我不明白你的最后一句话:“大多数对线程的调用。睡眠本质上是黑客行为”。请原谅,
Thread.Sleep的有效使用很少,除非是在紧凑的处理器密集型循环中,这些循环需要强制减速,以避免以最大利用率运行CPU(处理器密集型循环是提高CPU利用率的一种方式,因为根据定义,它们不会中断,除非调度程序确定它们应该/必须中断)。我发现对线程.Sleep
的大多数调用都是不必要的,它们只会减慢自然阻塞的速度,或者不需要减慢的速度。问问自己:为什么要停止处理?
byte[] buffer = new byte[1024];
int numberOfBytesRead = 0;
FileStream fs = new FileStream(@"C:\file.png", FileMode.Create, FileAccess.Write);
do
{
numberOfBytesRead = serverStream.Read(buffer, 0, buffer.Length); //Read from network stream
fs.Write(buffer, 0, numberOfBytesRead);
} while (serverStream.DataAvailable);
fs.Close();