同步方法和异步方法:
同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果。(比如烧水泡茶,需要等水烧开了才能继续泡茶)
异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作。(比如烧水做饭,当水烧着的时候,还可以做饭)
定义一个下载的方法:
private void Download(string filename) { Console.WriteLine($"开始Download {filename}******当前线程:{Thread.CurrentThread.ManagedThreadId}"); Thread.Sleep(new Random().Next(5, 10) * 1000); Console.WriteLine($"Download {filename} 完成******当前线程:{Thread.CurrentThread.ManagedThreadId}"); }
使用同步方法调用:
Console.WriteLine($"下载开始*******当前线程:{Thread.CurrentThread.ManagedThreadId}"); for (int i = 0; i < 3; i++) { string file = "文件" + i; this.Download(file); } Console.WriteLine($"下载结束*******当前线程:{Thread.CurrentThread.ManagedThreadId}");
输出结果:文件按顺序下载,所有的线程ID都是1
使用异步方法调用:
Console.WriteLine($"下载开始*******当前线程:{Thread.CurrentThread.ManagedThreadId}"); Action<string> action = this.Download; for (int i = 0; i < 3; i++) { string file = "文件" + i; action.BeginInvoke(file, null, null); } Console.WriteLine($"下载结束*******当前线程:{Thread.CurrentThread.ManagedThreadId}");
输出结果:文件下载顺序不固定,结束顺序不固定,每个下载都有自己的线程ID。
BeginInvoke 方法用于启动异步调用。它与需要异步执行的方法具有相同的参数,只不过还有两个额外的参数。
BeginInvoke 立即返回,不等待异步调用完成。
BeginInvoke 返回 IasyncResult,可用于监视调用进度。
EndInvoke 方法用于检索异步调用结果。调用 BeginInvoke 后可随时调用 EndInvoke 方法;如果异步调用未完成,EndInvoke 将一直阻塞到