c#同步异步调用和异步回调
前言:由于项目需求,对主线程的效率要求非常高,导致主线程中一些耗时的操作必须使用特殊手段进行处理。因此,多方求索,找到最适合的方法:异步回调。当耗时的方法异步处理后,主线程不会的等待当前方法执行,而是继续向下执行。但是本方法需要在执行结束后才可以执行一些操作,只是用单纯的异步操作不能达到目的,因此,使用异步回调,当耗时方法执行结束后会自动执行回调函数。
注:使用异步的时候,要尤其注意线程安全问题,当异步线程使用主线程当中的引用类型的数据(例如:list等等),当主线程非常快的情况下,异步线程还没有执行完毕,主线程改变了引用类型的数据,导致异步线程的数据也会相应改变,便会出现线程安全问题。解决这个问题有以下方法:
1.使用线程安全带的类型。
2.每次线程来的时候都重新实例化一个类型,将数据存放在此变量中。
3.使用线程安全的遍历方式。
开始:
由于异步还回调,两个概念在自己脑袋中还是不是太清晰吗,所以有必要罗列出同步,异步和异步回调并加以对比,才可以做到更好的理解!
以下内容摘自网络,仅供学习使用!
C#异步委托(异步方法调用)一: 同步调用 : 程序顺序执行时-->调用很耗时的[方法]-->阻塞当前线程-->[方法]调用完成-->继续执行。 异步调用 : --------------------------------------------------------------------------------委托例子 : 自写委托如下 : public delegate String MyDelegate(String name);微软会自动提供下面两个方法 : IAsyncResult BeginInvoke(String name, AsyncResult callback, Object o);String EndInvoke(IAsyncResult result);--------------------------------------------------------------------------------每个委托都有3个方法 : Invoke : 是委托指定函数的同步调用;BeginInvoke : 是异步调用, 调用后立即返回,不等待调用结果EndInvoke : 是异步调用, 用于检索调用结果。调用BeginInvoke后可随时调用, 它将一直阻塞到异步调用完成。AsyncCallback 委托 : 用于指定在开始操作完成后应被调用的方法。 IAsyncResult 接口 : 用于监视和管理异步操作。public interface IAsyncResult {Object AsyncState { get; } // 该属性为BeginInvoke参数中的最后一个参数对象WaitHandle AsyncWaitHandle { get; } // bool CompletedSynchronously { get; } // 如果开始操作调用已同步完成,则其属性将被设置为 true。bool IsCompleted { get; } // 该属性判断异步调用是否结束 }--------------------------------------------------------------------------------例子 : 1) 定义一个委托 :using System.Threading;using System.Runtime.Remoting.Messaging;public delegate int AddHandler(int a,int b);public class 加法类{public static int Add(int a, int b){Console.WriteLine("开始计算:" + a + "+" + b);Thread.Sleep(3000); //模拟该方法运行三秒Console.WriteLine("计算完成!");return a + b;}}2) 同步调用 : 委托的Invoke方法用来进行同步调用。同步调用也可以叫阻塞调用,它将阻塞当前线程,然后执行调用,调用完毕后再继续向下进行。public class 同步调用{static void Main(){Console.WriteLine("===== 同步调用 SyncInvokeTest =====");AddHandler handler = new AddHandler(加法类.Add);int result = handler.Invoke(1, 2);Console.WriteLine("继续做别的事情。。。");Console.WriteLine(result);Console.ReadKey();}/*运行结果:===== 同步调用 SyncInvokeTest =====开始计算:1+2计算完成!继续做别的事情。。。3 */}3) 异步调用 : 异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。委托的异步调用通过BeginInvoke和EndInvoke来实现。public class 异步调用{static void Main(){Console.WriteLine("===== 异步调用 AsyncInvokeTest =====");AddHandler handler = new AddHandler(加法类.Add);//IAsyncResult: 异步操作接口(interface)//BeginInvoke: 委托(delegate)的一个异步方法的开始IAsyncResult result = handler.BeginInvoke(1, 2, null, null);Console.WriteLine("继续做别的事情。。。");//异步操作返回 Console.WriteLine(handler.EndInvoke(result));Console.ReadKey();}/*运行结果:===== 异步调用 AsyncInvokeTest =====继续做别的事情。。。开始计算:1+2计算完成!3 */}4) 异步回调 : 用回调函数,当调用结束时会自动调用回调函数,解决了为等待调用结果,而让线程依旧被阻塞的局面。public class 异步回调{static void Main(){Console.WriteLine("===== 异步回调 AsyncInvokeTest =====");AddHandler handler = new AddHandler(加法类.Add);//异步操作接口(注意BeginInvoke方法的不同!)IAsyncResult result = handler.BeginInvoke(1,2,new AsyncCallback(回调函数),"AsycState:OK");Console.WriteLine("继续做别的事情。。。");Console.ReadKey();}static void 回调函数(IAsyncResult result){ //result 是“加法类.Add()方法”的返回值//AsyncResult 是IAsyncResult接口的一个实现类,空间:System.Runtime.Remoting.Messaging//AsyncDelegate 属性可以强制转换为用户定义的委托的实际类。AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;Console.WriteLine(handler.EndInvoke(result));Console.WriteLine(result.AsyncState);}/*运行结果:===== 异步回调 AsyncInvokeTest =====开始计算:1+2继续做别的事情。。。计算完成!3AsycState:OK*/}总结 : Invoke方法首先检查发出调用的线程(即当前线程)是不是UI线程,如果是,直接执行委托指向的方法,如果不是,它将切换到UI线程,然后执行委托指向的方法。
c#同步异步调用和异步回调相关推荐
- C#(同步调用、异步调用、异步回调)
本文将主要通过"同步调用"."异步调用"."异步回调"三个示例来讲解在用委托执行同一个"加法类"的时候的的区别和利弊. ...
- C#“同步调用”、“异步调用”、“异步回调”
本文将主要通过"同步调用"."异步调用"."异步回调"三个示例来讲解在用委托执行同一个"加法类"的时候的的区别和利弊. ...
- C# 委托(同步调用、异步调用、异步回调)
文章转自:http://www.csharpwin.com/csharpspace/12393r3151.shtml 本文将主要通过"同步调用"."异步调用". ...
- java thrift异步调用_thrift异步调用 - thrift-cob_style-tnonblockingserver - ItBoth
[ thrift 在python中使用了 tornado和 twisted 来作为异步的webserive服务提供异步接口,自身并没有实现 twisted: Generate ...
- java 多异步调用_java 异步调用与多线程
异步与多线程的区别 一.异步和多线程有什么区别?其实,异步是目的,而多 线程是实现这个目的的方法.异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作 就没有必要异步了),可以继续自顾 ...
- C#异步调用、异步回调
1.使用委托的BeginInvoke和EndInvoke实现异步. public delegate string ShowName();static void Main(string[] args){ ...
- python异步调用shell_异步 - 如何从Python异步运行外部命令?
异步 - 如何从Python异步运行外部命令? 我需要从Python脚本异步运行shell命令. 通过这个我的意思是我希望我的Python脚本在外部命令关闭时继续运行并执行它需要做的任何事情. 我看过 ...
- C#同步和异步(四)等待异步调用完成
如果有一种特殊需求,我们希望等待异步调用结束后继续执行后面的语句.这种形式和同步一样.那么怎么实现呢? 下面介绍两种实现方式: 1.简单方式 利用IAsyncResult中的IsCompleted属性 ...
- mq服务器与客户端消息同步,使用 ActiveMQ 实现JMS 异步调用
目录 简介 服务之间的同步调用,可以使用 HTTP 或 RPC 来完成,但并非所有的调用都需要同步,有些场景下,当客户端调用服务端时,并不需要等待服务端做出响应,此时就应该使用异步调用.异步调用的常用 ...
最新文章
- java file 如何关闭,java – 如何正确关闭从FileOutputStream获取的FileChannel
- linux 杀死脚本,linux – 如何在Bash脚本被杀死时杀死当前命令
- xcode 怎么调用midi开发录音_如何组建个人录音工作室
- 数字图像处理之图像几何变换
- 使用 dotnet-monitor 分析.NET 应用程序
- 实例60:python
- 系统学习深度学习(三十四)--Dueling DQN
- Unity BMFont自定义字体
- 从Q2财报,看携程的内容“元宇宙”
- 阿铭Linux第二章笔记
- VMware虚拟机安装Kali破解WiFi密码
- 台式计算机开不了机,台式电脑开不了机
- UnityEngine.Quaternion.LookRotation的使用(感觉这个用着还不错做一个笔记)
- Web-Security-Learning
- modern ui html,非常漂亮的WPF界面框架(Modern UI for WPF)
- java基础-宇宙第一YWM:数组数算题目记录
- go 注册登录 mysql_golang后台 实现用户登录注册
- 软件测试分享15个适合练手的项目【金融/银行/商城/电商/医药......】
- lect01_codes_高阶语法
- SVN使用教程(一)