C#异步编程

Posted 小小鱼的代码基地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#异步编程相关的知识,希望对你有一定的参考价值。

1.在系统中,每一个程序启动时,系统会分配一个进程,用以调度系统和CPU资源。而线程则是进程真正的内核。一般来说,一个进程有一个线程,但是可以通过异步编程来实现多线程编程,提高程序运行效率。


比如在程序运行中,可以使用异步编程来处理UI响应,这样程序就不必等待UI加载时间,直接进入交互逻辑运算,UI则开辟新线程来处理。实现程序的同步处理。


2. 基础的异步编程可由委托来实现。

委托实现的异步编程有三种方法,第一个是在当前线程中开辟新线程处理,并等待处理结果,再进行接下来的运算。这是最简单的异步编程,但本质上和单线程没什么区别。

第二种方法则是,开启新线程后,继续处理接下来的任务,在当前线程中定期查询异步编程是否完成,完成后再处理返回的数据结果。

第三种方法则是在开辟新线程后,完全不管新线程的进行,只是提前写好处理代码,把其委托传入新线程,系统会在新线程完成后自动回调处理方法

3. 具体代码。

第二种方法:



分析这段代码。

基础异步编程是靠委托来实现的。

每一个委托变量都有BeginInvoke和EndInvoke这两个方法。

Begin方法的作用是在系统线程池中开辟一个新的线程,计算处理这个委托变量所包含的方法。


Begin方法有三个参数,第一个参数是所包含的方法需要的参数。在这个例子中,del所委托的Add方法有两个参数,所以第一个参数就是两个整形变量。


第二和第三个参数是是回调法所需要的,等下再说。


Begin方法会返回一个实现了接口IAsyncResult的对象的引用。这个对象实现了接口的两个成员,AsyncState和IsCompleted。AsyncState是回调法用到的,Iscompleted就是这个例子中用到的变量,它是一个bool类型的值,表示新线程中的方法是否完成,当值为false的时候,就表示还没有完成。


所以循查法就是不停检测新线程是否完成,如果完成就获取返回结果,没有就继续其他代码的执行。


End方法的作用有两个,一个是返回新线程的处理结果,第二个是清除新线程的资源,节省CPU的资源。


回调法,代码如下:



在回调法中也是用委托的Begin方法来开辟新线程的,而不同点在于,回调法不需要在原来的线程中查询新线程的有关信息,而是在开辟新线程的时候,就把对结果的处理方法传进新线程,这样新线程的计算完成后,就会自动处理结果并消除线程。


传进处理方法也是通过委托实现,在Begin方法中,以第二个参数传进去。


处理方法的委托必须为AsyncResult类型的委托。AsyncResult类型的委托返回值必须为void,接受的参数必须为实现IAsyncResult的变量。Begin方法的第三个参数则是一个Object类的变量,它的作用是把处理方法需要的使用到的类传进去。比如需要把处理结果返回到主线程的一个变量中,则需要在创建新线程的时候,把这个变量传入Begin方法中。


IAsyncResult接口的另一个成员,AsyncState就是接受Begin方法传进来的那个变量。不过,一般来讲,第三个参数是把新线程的委托传进来,不然就无法在处理方法中对新线程中的处理结果进行操作了。


以上是关于C#异步编程的主要内容,如果未能解决你的问题,请参考以下文章

C#并发编程之异步编程(线程讨论)

[C#] 异步编程 - 剖析异步方法

[C#] 走进异步编程的世界 - 剖析异步方法(下)

C#异步编程基础入门总结

C#异步编程简单的运用

C#异步编程