异步编程
一、委托
(一)委托声明
(1)delegate
(2)Action
Action是无返回值的泛型委托。
(3)Func
Func是有返回值的泛型委托。Func<object,string,int> 表示传入参数为object, string 返回值为int的委托。
(4)predicate
predicate 是返回bool型的泛型委托。predicate<int> 表示传入参数为int 返回bool的委托。
二、异步
(一)异步三种模式
1、等待模式,在发起了异步方法以及做了一些其它处理之后,原始线程就中断,并且等待异步方法完成之后再继续。
2、轮询模式,原始线程定期检查发起的线程是否完成,如果没有则可以继续做一些其它的事情。
3、回调模式,原始线程一直在执行,无需等待或检查发起的线程是否完成。在发起的线程中的引用方法完成之后,发起的线程就会调用回调方法,由回调方法在调用EndInvoke之前处理异步方法的结构。
(二)等待模式
private static long Sum(int i, int j) { Debug.WriteLine("Sum"); return i + j; } static long SumFunc<T1, T2>(Func<T1, T2, long> func, T1 a, T2 b) { return func(a, b); } private static void DebugWrite() { Func<int, int, long> fun = Sum; Debug.WriteLine("begin BeginInvoke"); IAsyncResult iar = fun.BeginInvoke(3, 5, null, null); Thread.Sleep(3000); Debug.WriteLine("end BeginInvoke"); long count = fun.EndInvoke(iar); Debug.WriteLine("end EndInvoke"); }
1、当我们调用委托对象的BeginInvoke方法时,系统创建了一个AsyncResult类的对象。然而,它不返回类的对象的引用,而是返回对象中包含的IasyncResult接口的引用。
2、AsyncResult对象包含一个叫做AsyncDelegate的属性,它返回一个指向被调用来开启异步方法的委托的引用。但是这个属性是类对象的一部分而是接口的一部分。
3、IsCompleted属性返回一个布尔值,表示异步方法是否完成。
4、AsyncState属性返回一个对象的引用,它被作为BeginInvoke方法调用时的state参数。
(三)轮询模式
在等待模式的基础上循环判断iar.IsCompleted是否完成,完成后执行EndInvoke返回值。
(四)回调模式
private static long Sum(int i, int j) { Debug.WriteLine("Sum"); return i + j; } static long SumFunc<T1, T2>(Func<T1, T2, long> func, T1 a, T2 b) { return func(a, b); } private static void DebugWrite() { Func<int, int, long> fun = Sum; Debug.WriteLine("begin BeginInvoke"); IAsyncResult iar = fun.BeginInvoke(3, 5, CallBack, "传入参数"); Thread.Sleep(3000); Debug.WriteLine("end EndInvoke"); } private static void CallBack(IAsyncResult iar) { AsyncResult asyncResult = (AsyncResult)iar; Debug.WriteLine(iar.AsyncState); var delegateAsync = asyncResult.AsyncDelegate; Func<int,int,long> fun = (Func<int, int, long>)delegateAsync; var result = fun.EndInvoke(iar); }