using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Diagnostics;
namespace FastDownloader
{
public partial class Form1 : Form
{
const int BUFFER_SIZE = 4096;
public delegate void m_SaveFile(byte[] contents, string file);
FileStream fs;
private void SaveFile(byte[] contents, string file)
{
if (fs == null)
{
fs = new FileStream(file, FileMode.Append);
}
fs.Write(contents, 0, contents.Length);
fs.Flush();
}
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// Run 20 simultaneous requests
for (int i = 0;i < 20; i++ )
{
ObjectState os = new ObjectState();
os.request = (HttpWebRequest)WebRequest.Create("http://www.yahoo.com/");
os.request.BeginGetResponse(new AsyncCallback(this.ResponseCallback), os);
}
}
public void ResponseCallback(IAsyncResult ar)
{
Debug.WriteLine("Got request back yo");
ObjectState os = (ObjectState)ar.AsyncState;
os.response = os.request.EndGetResponse(ar);
os.responseStream = os.response.GetResponseStream();
os.responseStream.BeginRead(os.bufferRead, 0, BUFFER_SIZE,
new AsyncCallback(this.ReadCallback), os);
}
public void ReadCallback(IAsyncResult ar)
{
Debug.WriteLine("Got data back yo");
ObjectState os = (ObjectState)ar.AsyncState;
int read = os.responseStream.EndRead(ar);
if (read > 0) // Wewt, more data to read
{
os.memoryStream.Write(os.bufferRead, 0, read);
os.responseStream.BeginRead(os.bufferRead, 0, BUFFER_SIZE,
new AsyncCallback(ReadCallback), os);
}
else // 0 bytes, so request has completed
{
Debug.WriteLine("Request finished");
// Close Streams
os.responseStream.Close();
os.response.Close();
// Save file
this.Invoke(new m_SaveFile(this.SaveFile), new object[] { os.memoryStream.ToArray(), @"c:\stuff\output.txt" });
// Do it all over again!
os = new ObjectState();
os.request = (HttpWebRequest)WebRequest.Create("http://www.yahoo.com/");
os.request.BeginGetResponse(new AsyncCallback(ResponseCallback), os);
}
}
}
public class ObjectState
{
public const int BUFFER_SIZE = 4096;
public byte[] bufferRead;
public HttpWebRequest request;
public WebResponse response;
public Stream responseStream;
public MemoryStream memoryStream;
public ObjectState()
{
bufferRead = new byte[BUFFER_SIZE];
request = null;
responseStream = null;
memoryStream = new MemoryStream();
}
}
}