最近看书,看到了可以利用学过的委托知识实现异步编程,这里做一个简单的说明示例。如果委托对象在调用列表中只有一个方法(引用方法),他就可有异步执行这个方法。委托类有两个方法,BeginInvoke和EndInvoke。
- 当我们调用委托的BeginInvoke方法时,它开始在一个独立线程上执行引用方法。并且立即返回到原始线程。原始线程可以继续。而引用方法会在线程池中的线程中并行执行。
- 当程序希望获取已完成的异步方法的结果时,可以检查BeginInvoke返回的IAsyncResult的IsCompleted属性。或调用委托的EndInvoke方法来等待委托完成。
等待-直到完成 模式
delegate string MyDownLoadDel(string weburl);
static void Main(string[] args)
{
Stopwatch watch = new Stopwatch();
watch.Start();
Debug.WriteLine(string.Format("开始计时:{0,4:N0}ms", watch.Elapsed.TotalMilliseconds));
MyDownLoadDel del = new MyDownLoadDel(DownLoadWeb);
IAsyncResult iar = del.BeginInvoke("https://www.asp.net/", null, null);
Debug.WriteLine(string.Format("委托BeginInvoke:{0,4:N0}ms", watch.Elapsed.TotalMilliseconds));
string str = del.EndInvoke(iar);
Debug.WriteLine(string.Format("EndInvoke,下载网站大小:{0}耗时:{1,4:N0}ms", str.Length, watch.Elapsed.TotalMilliseconds));
Console.ReadKey(); //暂停
}
public static string DownLoadWeb(string url)
{
WebClient wc = new WebClient();
string str = wc.DownloadString(url);
Debug.WriteLine(string.Format("下载网站{0}结束", url));
return s