I am writing a console application that needs to receive a large amount of data. I tried to code it like this,
我正在编写一个控制台应用程序,它需要接收大量的数据。我试着这样编码,
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
responseText = sr.ReadToEnd();
}
Console.WriteLine(responseText);
But this code needs to wait for the entire response to write out the data to the console. How can I recode this to stream the data to the console as it is being received?
但是这段代码需要等待整个响应将数据写到控制台。如何重新编码以在接收数据时将数据流到控制台?
Thanks.
谢谢。
4 个解决方案
#1
1
If you are getting a large data, you will need to use HttpWebRequest asynchronously.
如果您正在获取大数据,您将需要异步使用HttpWebRequest。
Use HttpWebRequest.BeginGetResponse()
使用HttpWebRequest.BeginGetResponse()
HttpWebRequest webRequest;
void StartWebRequest()
{
webRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest),null);
}
void FinishWebRequest(IAsyncResult result)
{
webRequest.EndGetResponse(result);
}
When the asynchronous operation is complete, a callback function is been called. You need to at least call EndGetResponse() from this function.
当异步操作完成时,将调用回调函数。您至少需要从这个函数中调用EndGetResponse()。
#2
0
Try reading one line at a time: ReadLine()
:
试着一次读一行:ReadLine():
while (!sr.EndOfStream)
{
responseText = sr.ReadLine();
Console.WriteLine(responseText);
}
#3
0
char[] chars = new char[1024];
int numread = 0;
while ((numread = sr.Read(chars, 0, chars.Length)) > 0)
Console.Write(new string(chars));
Console.WriteLine();
#4
0
That's what ReadToEnd()
means.
这就是ReadToEnd()方法。
To write everything to a file:
将所有内容写入文件:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
var responseStream = response.GetResponseStream();
using (var fileStream = new FileStream("C:\\temp\\myfile.avi"))
{
var buffer = new byte[8192];
while (true)
{
var bytesRead = responseStream.Read(buffer, 0, buffer.Length);
if (bytesRead <= 0)
break;
fileStream.Write(buffer, 0, bytesRead);
}
}
#1
1
If you are getting a large data, you will need to use HttpWebRequest asynchronously.
如果您正在获取大数据,您将需要异步使用HttpWebRequest。
Use HttpWebRequest.BeginGetResponse()
使用HttpWebRequest.BeginGetResponse()
HttpWebRequest webRequest;
void StartWebRequest()
{
webRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest),null);
}
void FinishWebRequest(IAsyncResult result)
{
webRequest.EndGetResponse(result);
}
When the asynchronous operation is complete, a callback function is been called. You need to at least call EndGetResponse() from this function.
当异步操作完成时,将调用回调函数。您至少需要从这个函数中调用EndGetResponse()。
#2
0
Try reading one line at a time: ReadLine()
:
试着一次读一行:ReadLine():
while (!sr.EndOfStream)
{
responseText = sr.ReadLine();
Console.WriteLine(responseText);
}
#3
0
char[] chars = new char[1024];
int numread = 0;
while ((numread = sr.Read(chars, 0, chars.Length)) > 0)
Console.Write(new string(chars));
Console.WriteLine();
#4
0
That's what ReadToEnd()
means.
这就是ReadToEnd()方法。
To write everything to a file:
将所有内容写入文件:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
var responseStream = response.GetResponseStream();
using (var fileStream = new FileStream("C:\\temp\\myfile.avi"))
{
var buffer = new byte[8192];
while (true)
{
var bytesRead = responseStream.Read(buffer, 0, buffer.Length);
if (bytesRead <= 0)
break;
fileStream.Write(buffer, 0, bytesRead);
}
}