我異步使用的WebRequest這樣從URL下載圖像:如何從網上下載一個圖像,顯示使用winforms在C#下載的進度?
public void Download(string url)
{
byte[] buffer = new byte[0x1000];
WebRequest request = HttpWebRequest.Create(url);
request.Method = "GET";
request.ContentType = "image/gif";
request.BeginGetResponse(result =>
{
WebRequest webRequest = result.AsyncState as WebRequest;
WebResponse response = webRequest.EndGetResponse(result);
ReadState readState = new ReadState()
{
Response = response.GetResponseStream(),
AccumulatedResponse = new MemoryStream(),
Buffer = buffer,
};
readState.Response.BeginRead(buffer, 0,
readState.Buffer.Length, ReadCallback, readState);
}, request);
}
public void ReadCallback(IAsyncResult result)
{
ReadState readState = result.AsyncState as ReadState;
int bytesRead = readState.Response.EndRead(result);
if(bytesRead > 0)
{
readState.AccumulatedResponse.BeginWrite(readState.Buffer, 0, bytesRead, writeResult =>
{
readState.AccumulatedResponse.EndWrite(writeResult);
readState.Response.BeginRead(readState.Buffer, 0, readState.Buffer.Length, ReadCallback, readState);
}, null);
}
else
{
readState.AccumulatedResponse.Flush();
readState.Response.Close();
pictureBox1.Image = Image.FromStream(readState.AccumulatedResponse);
}
}
public class ReadState
{
public Stream Response { get; set; }
public Stream AccumulatedResponse { get; set; }
public byte[] Buffer { get; set; }
}
和它的作品不錯,但我想顯示下載進度的瀏覽器做的,而不是隻顯示當它飾面。
如果我做
pictureBox1.Image = Image.FromStream(readState.AccumulatedResponse);
它完成我得到一個例外,該圖片是無效的,即使它有一些數據之前。 無論如何顯示部分數據?
如果圖像無效,就圖片框控件而言,您的運氣不大。就進度而言......檢查Response的ContentLength以瞭解文件的大小。 – 2009-04-27 07:59:09