前言:由于项目需求,对主线程的效率要求非常高,导致主线程中一些耗时的操作必须使用特殊手段进行处理。因此,多方求索,找到最适合的方法:异步回调。当耗时的方法异步处理后,主线程不会的等待当前方法执行,而是继续向下执行。但是本方法需要在执行结束后才可以执行一些操作,只是用单纯的异步操作不能达到目的,因此,使用异步回调,当耗时方法执行结束后会自动执行回调函数。

注:使用异步的时候,要尤其注意线程安全问题,当异步线程使用主线程当中的引用类型的数据(例如: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#同步异步调用和异步回调相关推荐

  1. C#(同步调用、异步调用、异步回调)

    本文将主要通过"同步调用"."异步调用"."异步回调"三个示例来讲解在用委托执行同一个"加法类"的时候的的区别和利弊. ...

  2. C#“同步调用”、“异步调用”、“异步回调”

    本文将主要通过"同步调用"."异步调用"."异步回调"三个示例来讲解在用委托执行同一个"加法类"的时候的的区别和利弊. ...

  3. C# 委托(同步调用、异步调用、异步回调)

    文章转自:http://www.csharpwin.com/csharpspace/12393r3151.shtml 本文将主要通过"同步调用"."异步调用". ...

  4. java thrift异步调用_thrift异步调用 - thrift-cob_style-tnonblockingserver - ItBoth

    [ thrift 在python中使用了 tornado和  twisted 来作为异步的webserive服务提供异步接口,自身并没有实现     twisted:         Generate ...

  5. java 多异步调用_java 异步调用与多线程

    异步与多线程的区别 一.异步和多线程有什么区别?其实,异步是目的,而多 线程是实现这个目的的方法.异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作 就没有必要异步了),可以继续自顾 ...

  6. C#异步调用、异步回调

    1.使用委托的BeginInvoke和EndInvoke实现异步. public delegate string ShowName();static void Main(string[] args){ ...

  7. python异步调用shell_异步 - 如何从Python异步运行外部命令?

    异步 - 如何从Python异步运行外部命令? 我需要从Python脚本异步运行shell命令. 通过这个我的意思是我希望我的Python脚本在外部命令关闭时继续运行并执行它需要做的任何事情. 我看过 ...

  8. C#同步和异步(四)等待异步调用完成

    如果有一种特殊需求,我们希望等待异步调用结束后继续执行后面的语句.这种形式和同步一样.那么怎么实现呢? 下面介绍两种实现方式: 1.简单方式 利用IAsyncResult中的IsCompleted属性 ...

  9. mq服务器与客户端消息同步,使用 ActiveMQ 实现JMS 异步调用

    目录 简介 服务之间的同步调用,可以使用 HTTP 或 RPC 来完成,但并非所有的调用都需要同步,有些场景下,当客户端调用服务端时,并不需要等待服务端做出响应,此时就应该使用异步调用.异步调用的常用 ...

最新文章

  1. java file 如何关闭,java – 如何正确关闭从FileOutputStream获取的FileChannel
  2. linux 杀死脚本,linux – 如何在Bash脚本被杀死时杀死当前命令
  3. xcode 怎么调用midi开发录音_如何组建个人录音工作室
  4. 数字图像处理之图像几何变换
  5. 使用 dotnet-monitor 分析.NET 应用程序
  6. 实例60:python
  7. 系统学习深度学习(三十四)--Dueling DQN
  8. Unity BMFont自定义字体
  9. 从Q2财报,看携程的内容“元宇宙”
  10. 阿铭Linux第二章笔记
  11. VMware虚拟机安装Kali破解WiFi密码
  12. 台式计算机开不了机,台式电脑开不了机
  13. UnityEngine.Quaternion.LookRotation的使用(感觉这个用着还不错做一个笔记)
  14. Web-Security-Learning
  15. modern ui html,非常漂亮的WPF界面框架(Modern UI for WPF)
  16. java基础-宇宙第一YWM:数组数算题目记录
  17. go 注册登录 mysql_golang后台 实现用户登录注册
  18. 软件测试分享15个适合练手的项目【金融/银行/商城/电商/医药......】
  19. lect01_codes_高阶语法
  20. SVN使用教程(一)

热门文章

  1. 无锁队列Disruptor
  2. 最全笔记程序推荐收集
  3. Oracle 12CR2查询转换之表扩展
  4. 通过游戏编程学Python(2)— 脑筋急转弯
  5. LRN 局部响应归一化详解
  6. 指数随机变量 泊松过程跳_随机过程学习笔记(1):指数分布与泊松过程
  7. 【帝国CMS】输出带序号的列表(数字排序适用于排行榜)
  8. nacos的服务发现详解
  9. 数据总量 40 亿+,报表分析数据 10 亿+,TiDB 在中通的落地与进化
  10. js复制html样式,js对象深拷贝的方法