1、使用委托类型的BeginXXX,EndXXX
2、使用事件
3、使用aysnc,await关键字,会自动切换回UI线程,启动方法的线程可以被重用,线程没有阻塞。内部其实是封闭了Task类的ContinueWith方法,把await关键字行后边的代码放入ContinueWith方法。无依赖的多个等待方法,使用await Task.WhenAll(t1,t2)做统一等待不会阻塞当前线程
4、把BeginXXX,EndXXX转换为基于任务的异步模式
1) 把同步方法封入委托,进而可以使用BeginXXX,EndXXX。
2) 使用Task<T>.Factory.FromAsync<T>(BeginXXX,EndXXX,object,object)进入封装