通过定义委托,来实现同步和异步,委托通过Action和Func来实现,记录学习委托的同步和异步的过程

委托的同步方法

委托的Invoke方法用来进行同步调用。

        static void Main(string[] args)
{
//无参数方法
Action action = () => Console.WriteLine("action方法执行"); action.Invoke(); //有一个参数(多个参数基本相同)
Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t); action2.Invoke("我在测试"); //带一个参数带返回值
Func<int, bool> func = (t) => { int i = new Random().Next(1, 10);
Console.WriteLine("随机数是{0}", i);
return i > t;
};
bool b = func.Invoke(5);
Console.WriteLine("{0}",b); Console.Read();
}

同步调用会阻塞线程,如果是要调用一项繁重的工作(如大量IO操作),可能会让程序停顿很长时间,造成糟糕的用户体验,这时候异步调用就很有必要了。

委托的异步调用

异步调用不阻塞线程,而是把调用塞到线程池中,程序主线程或UI线程可以继续执行。委托的异步调用通过BeginInvoke和EndInvoke来实现。

        static void Main(string[] args)
{
//无参数方法
Action action = () => Console.WriteLine("action方法执行"); action.BeginInvoke(null,null); //有一个参数(多个参数基本相同)
Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t); action2.BeginInvoke("我是个测试",null,null); //带一个参数带返回值
Func<int, bool> func = (t) => { int i = new Random().Next(1, 10);
Console.WriteLine("随机数是{0}", i);
return i > t;
};
var result = func.BeginInvoke(5,null,null); bool b = func.EndInvoke(result); Console.WriteLine("{0}",b); Console.Read();
}

异步回调

用回调函数,当调用结束时会自动调用回调函数,解决了为等待调用结果,而让线程依旧被阻塞的局面。

        static void Main(string[] args)
{
//无参数方法
Action action = () => Console.WriteLine("action方法执行"); AsyncCallback callback1 = t =>
{
Console.WriteLine("我是回调1");
}; action.BeginInvoke(callback1, null); //有一个参数(多个参数基本相同)
Action<string> action2 = (t) => Console.WriteLine("action方法执行,{0}", t);
AsyncCallback callback2 = t =>
{
Console.WriteLine("我是回调2");
};
action2.BeginInvoke("我是个测试", callback2, null); //带一个参数带返回值
Func<int, bool> func = (t) => { int i = new Random().Next(1, 10);
Console.WriteLine("随机数是{0}", i);
return i > t; };
AsyncCallback callback3 = t =>
{
Console.WriteLine("我是回调3");
};
var result = func.BeginInvoke(5, callback3, null); bool b = func.EndInvoke(result); Console.WriteLine("{0}",b); Console.Read();
}

C#中委托的同步和异步有什么区别的更多相关文章

  1. 关于js中Ajax的同步、异步使用

    下面一个简单的例子,说明前后端交互中,Ajax同步和异步的使用 1.设置简单的一个div,包含触发事件 CompanyType() <div> <input type="h ...

  2. iOS开发中如何实现同步、异步、GET、POST等请求实操演示!

    1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然 ...

  3. JS中Ajax的同步和异步

    ajax同步 : 意味着此时请求Server后,JS代码不再继续执行,等待Server返回后才继续往下执行. ajax异步 : 意味着此时请求Server后,JS代码继续执行,不管Server什么时候 ...

  4. Java系统中如何拆分同步和异步

    很多开发人员说,将应用程序切换到异步处理很复杂.因为他们有一个天然需要同步通信的Web应用程序.在这篇文章中,我想介绍一种方法来达到异步通信的目的:使用一些众所周知的库和工具来设计他们的系统. 下面的 ...

  5. java交互方式中的同步与异步

    JAVA中交互方式分为同步和异步两种: 1.同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程; 2.异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即 ...

  6. 谈IO中的阻塞和非阻塞,同步和异步及三种IO模型

    什么是同步和异步? 烧水,我们都是通过热水壶来烧水的.在很久之前,科技还没有这么发达的时候,如果我们要烧水,需要把水壶放到火炉上,我们通过观察水壶内的水的沸腾程度来判断水有没有烧开.随着科技的发展,现 ...

  7. C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)

    C# code namespace UDPServer { class Program { static void Main(string[] args) { int recv; byte[] dat ...

  8. 【Java面试题】25 同步和异步有何异同,在什么情况下分别使用他们?举例说明。

    如果数据将在线程间共享.例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取. 当应用程序在对象上调用了一个需要花费很长时间 ...

  9. Java的同步和异步

    同步:发送一个请求,等待返回,然后再发送下一个请求 异步:发送一个请求,不等待返回,随时可以再发送下一个请求 同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同 ...

随机推荐

  1. lambda表达式应用在闭包中

    def make_repeat(n): return lambda s : s * n a = make_repeat(2) print(a(8)) 等于 def make_repeat(n): de ...

  2. 创建X个任意元素数组并且可以遍历的的一个方法

    方法一: Array.apply(null, { length: 20 })分析:apply 第二个参数应该是数组,现在把 { length: 20 } 转化为数组,就是一个长度为X的数组(类数组对象 ...

  3. 基于python的Splash基本使用和负载均衡配置

    0.引言 由于在软件工程综合实践专题课程中,老师要求在博客园发表博客我自己做过的小项目,本博客为课程第一篇博客 本项目来源于寒假学习python网络爬虫时所做的实战小项目,经过精心挑选,选择了页面动态 ...

  4. Vue 组件的使用

    1.引入组件 import Week from '../week/main.vue' export default { name: "classMain", components: ...

  5. D - Dice Game (BFS)

    A dice is a small cube, with each side having a different number of spots on it, ranging from 1 to 6 ...

  6. 【Oracle】【9】阅读oracle执行计划

    正文: 工具:PLSQL 1,配置执行计划需要显示的项 工具→首选项→窗口类型→计划窗口→根据需要配置要显示在执行计划中的列 2,打开执行计划 在SQL窗口执行完一条select语句后按 F5 即可查 ...

  7. WEB UI 上传URL附件(使用方法备份)

    FUNCTION zcrm_update_atta. *"------------------------------------------------------------------ ...

  8. swoole框架和其所涉及的协议

    网络知识基础 OSI协议 :应用层.表示层.会话层.传输层.网络层.数据链路层.物理层 tcp通信 TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道(三次握手.四次挥手). ...

  9. recyclerview 主活动里监听点击事件

    记性真的不行啊...贴上来有时间多复习复习 主活动 package com.example.com.webtext; import android.content.Intent; import and ...

  10. composer 自动加载(php-amqplib)

    最近要使用RabbitMQ 做消息队列,也是刚接触到.因为用的的TP框架,comoser又下载不下来,所以只能手动下载拓展包,做手动加载,在php-amqplib是我手动下载下来的拓展包,创建一个co ...