public bool StartAsync() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(server.hostpath); finished = new ManualResetEvent(false); writeEvent = new AutoResetEvent(true); OutFile = new FileStream(String.Format("{0}{1}", file.savepath, file.partname), FileMode.Create); buffer = new byte[1024]; request.BeginGetResponse(new AsyncCallback(ResponseCallback), request); finished.WaitOne(); OutFile.Close(); return true; } private void ResponseCallback(IAsyncResult ar) { WebRequest request = (WebRequest)ar.AsyncState; WebResponse response = request.EndGetResponse(ar); Stream strm = response.GetResponseStream(); strm.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(ReadCallBack), strm); } private void ReadCallBack(IAsyncResult ar) { Stream strm = (Stream)ar.AsyncState; int count = strm.EndRead(ar); if (count > 0) { OutFile.BeginWrite(buffer, 0, count, new AsyncCallback(WriteCallBack), OutFile); strm.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(ReadCallBack), strm); } else { strm.Close(); finished.Set(); } } private void WriteCallBack(IAsyncResult ar) { writeEvent.WaitOne(); FileStream fs = (FileStream)ar.AsyncState; fs.EndWrite(ar); writeEvent.Set(); }