宝哥软件园

NET异步编程总结——四种实现模式的代码总结

编辑:宝哥软件园 来源:互联网 时间:2021-09-11

我最近很忙。我要出去找工作,还要照顾老板公司的项目。今天在公司,抽空总结一下异步调用函数在中的实现方法。NET。在写这篇博文之前,DebugLZQ自己写了这篇文章的所有示例代码。他写之前做了功课,用代码说话很有说服力。

本文的内容旨在用最简单的代码阐明异步调用方法。花园里的老鸟可以绕来绕去,不喜欢就不要喷,非你莫属~

Lz之前的文章简单谈了一下异步,主要是从理解的角度;本文主要写具体的实现方法。异步编程有四种实现方式,其实对应异步调用的四种模式,分为“等待”和“回调”两类。我已经对代码中的四个方法做了详细的注释,这里就不再赘述了,直接用代码来解释就可以了

第一个方法是BeginEnvoke EndEnvoke方法,属于“等待”类。

使用系统;使用系统。集合。通用;使用系统。Linq使用系统。文字;使用系统。穿线;命名空间异步调用实现方法摘要{///summary ///异步调用方法摘要:///1。BeginInvoke endowoke////使用BeginInvoke异步调用方法时,如果方法没有完成,EndInvoke方法将始终阻塞。直到被调用的方法被执行////summary class程序{ public delegate void print delegate(字符串s);静态void Main(字符串printDelegate=Print控制台。WriteLine('主线程');IAsyncResult结果=printDelegate。BeginInvoke('Hello World ',null,null);控制台。WriteLine('主线程继续执行.');//当使用BeginInvoke异步调用方法时,如果方法没有完成,EndInvoke方法将阻塞,直到被调用的方法完成执行printDelegate。EndInvoke(结果);控制台。写线('按任意键继续.');控制台。ReadKey(真);} public static void print(strings){ console . write line('异步线程开始执行:' s ');线程。睡眠(5000);}}}注意点在代码中注明,程序运行结果如下:

第二种方法:WaitOne。它也属于“等待”的范畴。

使用系统;使用系统。集合。通用;使用系统。Linq使用系统。文字;使用系统。穿线;命名空间异步调用实现方法摘要2{ ///summary ///异步调用方法摘要:///2。WaitOne ///可以看出它和EndInvoke类似,只是用WaitOne函数编码。////摘要类Program { public delegate void print delegate(字符串s);静态void Main(字符串printDelegate=Print控制台。WriteLine('主线程');IAsyncResult结果=printDelegate。BeginInvoke('Hello World ',null,null);控制台。WriteLine('主线程继续执行.');结果。AsyncWaitHandle.WaitOne(-1,false);控制台。写线('按任意键继续.');控制台。ReadKey(真);} public static void print(strings){ console . write line('异步线程开始执行:' s ');线程。睡眠(5000);}}}注意点在代码中注明,程序运行结果如下:

第三种方法:轮询。它也属于“等待”的范畴。

使用系统;使用系统。集合。通用;使用系统。Linq使用系统。文字;使用系统。穿线;命名空间异步调用实现方法摘要3{ ///summary ///异步调用方法摘要:///3。轮询////上面提到的两种方法只能等到异步方法完成。///完成前没有提示信息,整个程序就像没反应一样,用户体验不好。///您可以通过检查IasyncResult类型的IsCompleted属性来检查异步调用是否已完成。///如果没有完成,可以适时显示一些提示信息。////汇总类程序{ public delegate void print delegate(字符串);静态void Main(字符串printDelegate=Print控制台。WriteLine('主线程: ' thread . currentthread . managed thread);IAsyncResult结果=printDelegate。BeginInvoke('Hello world ',null,null);控制台。WriteLine('主线程: ' thread . currentthread . managed thread ',继续执行.');while(!结果。IsCompleted) { Console。WriteLine(' . ');线程。睡眠(500);}控制台。WriteLine('主线程: ' thread . currentthread . managed thread '按任意键继续.');控制台。ReadKey(真);} public static void print(strings){ console . write line('当前线程:' thread . currentthread . managed threads ');线程。睡眠(5000);}}}注意点在代码中注明,程序运行结果如下:

第四种方法:回调。当然,它属于“回调”范畴。推荐!

前三种方法只有执行异步方法才能得到执行结果,在此期间主线程处于等待状态。回调和它们最大的区别在于,只要在调用BeginInvoke时提供了回调方法,主线程就不需要等待异步线程完成工作。异步线程完成工作后,会主动调用我们提供的回调方法,并在回调方法中做相应的处理。

使用系统;使用系统。集合。通用;使用系统。Linq使用系统。文字;使用系统。穿线;命名空间异步调用实现方法摘要4{ ///summary ///异步调用方法摘要:///4。callback////前三种方法要执行异步方法才能得到执行结果,在此期间主线程处于等待状态。///回调与它们最大的区别在于,只要在调用BeginInvoke时提供了回调方法,主线程就不需要等待异步线程完成工作。///工作完成后,异步线程会主动调用我们提供的回调方法,并在回调方法中做相应的处理,比如显示异步调用的结果。////摘要类Program { public delegate void print delegate(字符串s);静态void Main(字符串printDelegate=Print控制台。WriteLine('主线程');printDelegate。BeginInvoke('Hello world ',PrintComeplete,print delegate);控制台。WriteLine('主线程继续执行.');控制台。写线('按任意键继续.');控制台。ReadKey(真);} public static void print(strings){ console . write line('当前线程:' s ');线程。睡眠(5000);}//回调方法需要//1。返回类型是void //2。只有一个参数iasyncresult public static void print complete(iasyncresult){(result。作为printdelegate的异步状态)。endinvoke(结果);控制台。WriteLine('当前线程结束。结果。async state . ToString());}}}注意点在代码中注明,程序运行结果如下:

通过EndInvoke方法获取同步函数的返回值。上述同步方法返回一个void值。让我们举个例子:

使用系统。诊断;使用系统。穿线;使用系统窗户.命名空间TestDelegateWrapper {///summary///main window。xaml////摘要公共分部类main Window : Window { public main Window(){ InitializeComponent();}私有void ButtonBase_OnClick(对象发送方,RoutedEventArgs e){ WrapperSyncMethodAsync(' ABC ');追踪。写线('主线程继续.');}私有委托字符串SyncMethod1Delegate(字符串字符串);private void WrapperSyncMethodAsync(字符串字符串){ syncmethod 1委托syncmethod 1委托=sync method 1;同步方法1更新.BeginInvoke(str,x={ var result=syncmethod 1委托.end invoke(x);//使用结果做某事追踪.WriteLine(结果);},null);}私有字符串SyncMethod1(字符串字符串){线程.睡眠(2000年);返回字符串;} }}输出如下:

主线继续.字母表

以上就是四种实现异步调用函数的四种方法,说的很清楚了,就写这么多~希望对大家的学习有所帮助,也希望大家多多支持我们。

更多资讯
游戏推荐
更多+