using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Threading;
namespace prjDownLoad
{
class Program
{
//添加一个AutoResetEvent
//这是一个信号机
static AutoResetEvent are = new AutoResetEvent(false);
static void Main(string[] args)
{
//Version7.0
//将下载数据放入一个单独的线程中。
Thread t = new Thread(new ThreadStart(DownloadData));
t.Start();
//等着,直到有人通知说俺可以继续。
are.WaitOne();
Console.WriteLine("俺可以干其他的活了。");
//去掉俺最不喜欢的Console.ReadLine
//程序运行到这里为什么需要Console.ReadLine?
//因为现在如果直接结束主线程,那么异步回来的数据
//就没人接收了。
//为什么要去掉Console.ReadLine呢?
//你以为谁都像你一样的做的都是控制台应用程序?!
//Console.ReadLine();
}
static void DownloadData()
{
//不光WebResponse的获得使用异步方式
//连读取数据都使用异步方式。
//创建WebRequest对象
WebRequest wr = WebRequest.Create("http://blog.sina.com.cn/dalishuishou");
//开始异步地获取回应对象
//如果有了回应对象,那么把过程交给GetResponseCallBack去处理
wr.BeginGetResponse(new AsyncCallback(GetResponseCallBack), wr);
}
/// <summary>
/// 当有回应对象时调用这个方法来处理。
/// </summary>
/// <param name="result"></param>
static void GetResponseCallBack(IAsyncResult result)
{
//拿到那个请求对象
WebRequest wr = result.AsyncState as WebRequest;
//如果回应回完了,那么拿到回应对象
WebResponse wsp = wr.EndGetResponse(result);
//从回应中拿到流
Stream st = wsp.GetResponseStream();
//输出的文件流,此处也可替换为其他的流。
FileStream fs = new FileStream("c:\\ee.txt", FileMode.Create, FileAccess.Write);
//将异步操作过程中用到的信息封装为对象
DownloadInfo di = new DownloadInfo();
di.ReadSt = st;
di.WriteSt = fs;
//传入异步读取方法中
//第一个参数:读取的内容放到啥地方。
//第二个参数:从流的啥地方开始读取,一般从头开始,选择0。
//第三个参数:读取多少数据,一般容器多大,就读取多少数据。
//第四个参数:当读取完成后调用的方法,注意这个方法不是把所有数据都读取完成
// 而是这一次读取完成后,比如这次只读取了1024字节,那么当读取了