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(); } } }