定义一个异步线程类:

  public class AsyEventClass
{
private static ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
//异步线程,委托
public delegate string AsyncEventHandler(long num1, long num2);
public string ToDealData(long num1, long num2)
{
logger.Error("异步处理数据开始:num1:" + mainDigitalId + ",num2:");
//处理数据或其他操作return "异步成功,num1:" + mainDigitalId + ",num2:" + bindDigitalId;
} public void Callback(IAsyncResult result)
{
AsyncEventHandler handler = (AsyncEventHandler)((AsyncResult)result).AsyncDelegate;
logger.Error(handler.EndInvoke(result));
}
}

第一 同步调用

public class Program
{
static void Main()
{
Console.WriteLine("===== 同步调用,阻塞当前线程 =====");
AsyEventClass ac = new AsyEventClass();
AsyEventClass.AsyncEventHandler asy = new AsyEventClass.AsyncEventHandler(ac.ToDealData);
string result = asy.Invoke(num1,num2);
Console.WriteLine("此处会等上一步执行完再执行");
Console.WriteLine(result);
} }

第二  异步调用

public class Program
{
static void Main()
{
Console.WriteLine("=====异步调用,不会阻塞 ,但EndInvoke会因等待结果而阻塞====");
AsyEventClass ac = new AsyEventClass();
AsyEventClass.AsyncEventHandler asy = new AsyEventClass.AsyncEventHandler(ac.ToDealData);
IAsyncResult result = asy.BeginInvoke(num1,num2,null,null);
Console.WriteLine("此处不受影响,继续执行");
Console.WriteLine(asy.EndInvoke(result));// 如果异步处理时间过长,此处会阻塞线程,知道等到结果
} }

第三  异步回调

public class Program
{
static void Main()
{
Console.WriteLine("=====异步回调,不会阻塞,自动回调 ====");
AsyEventClass ac = new AsyEventClass();
AsyEventClass.AsyncEventHandler asy = new AsyEventClass.AsyncEventHandler(ac.ToDealData);
IAsyncResult result=asy.BeginInvoke(num1, num2, new AsyncCallback(ac.Callback), asy);//处理完自动回调callback方法,不会造成线程阻塞
Console.WriteLine("此处不受影响,继续执行");
} }

c#异步线程:同步调用,异步调用,异步回调的更多相关文章

  1. .net多线程,线程异步,线程同步,并发问题---1---ShinePans

    申请线程,输出线程状态: using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...

  2. js中的异步与同步,解决由异步引起的问题

    之前在项目中遇到过好多次因为异步引起的变量没有值,所以意识到了认识js中同步与异步机制的重要性 在单线程的js中,异步代码会被放入一个事件队列,等到所有其他代码执行后再执行,而不会阻塞线程. 下面是j ...

  3. C#中的异步和同步

    同步 同步(英语:Synchronization [ˌsɪŋkrənaɪ'zeɪʃn]),指对在一个系统中所发生的事件(event)之间进行协调,在时间上出现一致性与统一化的现象.说白了就是多个任务一 ...

  4. ajax中的async属性值之同步和异步及同步和异步区别

    jquery中ajax方法有个属性async用于控制同步和异步,默认是true,即ajax请求默认是异步请求,有时项目中会用到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里 ...

  5. Erlang运行时中的无锁队列及其在异步线程中的应用

    本文首先介绍 Erlang 运行时中需要使用无锁队列的场合,然后介绍无锁队列的基本原理及会遇到的问题,接下来介绍 Erlang 运行时中如何通过“线程进度”机制解决无锁队列的问题,并介绍 Erlang ...

  6. springboot 中如何正确在异步线程中使用request

    起因: 有后端同事反馈在异步线程中获取了request中的参数,然后下一个请求是get请求的话,发现会偶尔出现参数丢失的问题. 示例代码: @GetMapping("/getParams&q ...

  7. 千万不要把Request传递到异步线程里面!有坑!

    你好哇,我是歪歪. 前几天在网上冲浪的时候看到一篇技术文章,讲的是他把一个 request 请求传递到了线程池里面,然后遇到了一个匪夷所思的情况. 他写了这篇文章,把自己针对这个问题的探索过程分享了出 ...

  8. C#线程学习笔记六:线程同步--信号量和互斥体

    本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Mutex_And_Semaphore.html,记录一下学习过程以备后续查用.     ...

  9. 卸载AppDomain动态调用DLL异步线程执行失败

    应用场景 动态调用DLL中的类,执行类的方法实现业务插件功能 使用Assembly 来实现 但是会出现逻辑线程数异常的问题 使用AppDomain 实现动态调用,并卸载. 发现问题某个插件中开启异步线 ...

随机推荐

  1. Python下安装protobuf

    1. 下载安装包 2. 解压缩 tar –xzvf protobuf-2.6.1.tar.gz 3. 安装protoc 在python中使用protocbuf需要Protocal Buffer 编译器 ...

  2. 【转】在Unity中读写文件数据:LitJSON快速教程

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 介绍 JSON是一个简单的,但功能强大的序列 ...

  3. 雅礼集训 Day1 T3 画作 解题报告

    画作 题目描述 小\(\mathrm{G}\)的喜欢作画,尤其喜欢仅使用黑白两色作画. 画作可以抽象成一个\(r\times c\)大小的\(01\)矩阵.现在小\(\mathrm{G}\)构思好了他 ...

  4. Linux系统——提高编译速度的方法

    编译优化: 基本原则就是“以空间换时间” tmpfs: 解决IO瓶颈,充分利用本机内存资源 make -j: 充分利用本机计算资源 distcc: 利用多台计算机资源 ccache: 减少重复编译相同 ...

  5. MySQL数据库从windows迁移到linux

    前几天搭建了lamp环境,想把之前写的小东西迁到linux上运行,涉及到把mysql数据库的文件迁移到linux上,直接用fileZilla传过去应该不行,我试了下,反正没成功.下面是我采用的方法: ...

  6. HDU1263 map二维运用

    #include <iostream> #include <cstdio> #include <cstring> #include <map> #inc ...

  7. HDU3068 最长回文

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  8. UVA 10519 !! Really Strange !!

    //ans=2*n+(n-1)(n-2) n>=2#include <map> #include <set> #include <list> #include ...

  9. 小知识:SPI四种模式区别【转】

    转自:http://home.eeworld.com.cn/my/space-uid-80086-blogid-119198.html spi四种模式SPI的相位(CPHA)和极性(CPOL)分别可以 ...

  10. 为何url地址不是直接发送到服务器,而是被编码后再发送

    首先,先说一下,关于为何必须将url地址,去编码后,再发送,是因为相关的协议规范:RFC 1738,定义了url地址中不能包含除了0-9的数字,大小写字母(a-zA-Z),短横线’-‘ 之外的字母.换 ...