Tôi tải một hình ảnh từ một URL không đồng bộ sử dụng WebRequest theo cách này:Cách tải xuống hình ảnh từ web cho biết tiến trình tải xuống trong C# bằng cách sử dụng winforms?
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; }
}
và nó hoạt động ok, nhưng tôi muốn thể hiện sự tiến bộ của tải như các trình duyệt làm, và không hiển thị chỉ khi nó kết thúc.
Nếu tôi làm
pictureBox1.Image = Image.FromStream(readState.AccumulatedResponse);
trước khi nó kết thúc tôi nhận được một ngoại lệ mà hình ảnh không hợp lệ, mặc dù nó có một số dữ liệu. Có cách nào để hiển thị dữ liệu một phần không?
Nếu hình ảnh không hợp lệ, bạn sẽ không may mắn khi điều khiển PictureBox có liên quan. Theo tiến độ ... kiểm tra ContentLength của Response để biết tệp lớn như thế nào. –