可以使用Func<T>或者Action<T>简单实现如:

 Func<string, string,string,string, int> func = new Func<string, string, string,string,int>(OrderManager.CallWebService);
func.BeginInvoke(orderCode, "",userLoginName,ipAddress, null,resultCode);

这样直接就将方法改为异步的了。

Func<T>和Action<T>是.netFramework提供的委托,有很多重载。

区别是Func<T>有返回参数,Action<T>没有返回参数。

上面的例子:null是回调函数,可以定义一个回调函数,让方法执行完毕后在回调函数中做一些通知或者其他事情。

当Func<T>和Action<T>和不满足要求时,可以自定义委托,然后现实异步。

第二种使用:.Net Framework 4.0新增的System.Threading.Tasks命名空间下的Task类。

new一个Task类的对象,可以开启一个任务:

Task task = new Task(TaskMethod);
task.Start();

Task类有个静态属性Factory,这个属性返回一个TaskFactory对象。将方法传递给StartNew方法,任务会立即启动。

System.Threading.Tasks.Task.Factory.StartNew(() => OrderManager.CallWebService(orderCode, ""));

第二种方法摘抄自:C#异步编程的实现方式(4)——Task任务

您可以到这篇文章阅读,更简单明了的说明。

第三种:ThreadPool

利用ThreadPool也可以实现异步操作。

static void Main(string[] args)
{
for (int i = ; i <= ; i++)
{
ThreadPool.QueueUserWorkItem(WaitCallBackMethod, i);
}
Console.Read();
}

该文照抄自:C#异步编程的实现方式(3)——ThreadPool线程池

第四种:使用Thread

Thread thread3 = new Thread(ThreadMethod3);
thread3.Start(new ThreadData() { Message = "Hello world!" });

Thread可以传递一个Object参数,可以在object中封装你需要的任何参数。

第五种方法:C#异步编程的实现方式(1)——异步委托

感觉这种方法很强大,只是还没用过。

1)通过IsCompleted属性来判断该委托是否执行完成。

   : static void Imp1()
: {
: MyDelegate dl = DelegateMethod;
:
: IAsyncResult ar = dl.BeginInvoke(, null, null);
:
: while (!ar.IsCompleted)
: {
: Console.Write(".");
: Thread.Sleep();
: }
: string result = dl.EndInvoke(ar);
: Console.WriteLine("result: {0}", result);
: }

2、等待句柄(AsyncWaitHandle属性)

使用IAsyncResult的AsyncWaitHandle属性可以访问等待句柄,这个属性返回一个WaitHandle对象,这个对象的WaitOne()方法可输入一个超时时间作为参数,设置等待的最长时间。如果超时,WaitOne()方法返回一个bool值,true为等待成功(即委托完成),异步调用的方法与上面一样,下面是主线程实现:

   : static void Imp2()
: {
: MyDelegate dl = DelegateMethod;
:
: IAsyncResult ar = dl.BeginInvoke(, null, null);
: while (true)
: {
: Console.Write(".");
: if (ar.AsyncWaitHandle.WaitOne())
: {
: Console.WriteLine("Can get the result now");
: break;
: }
: }
: string result = dl.EndInvoke(ar);
: Console.WriteLine("result: {0}", result);
: }
主线程每等待50秒做一次判断是否完成。
 
3、异步回调(AsyncCallBack委托)
BeginInvoke方法第二个参数可传入一个AsnycCallBack委托类型的方法,当异步调用完成时会执行这个方法。我们可以用Lambda表达式来实现:
   : static void Imp3()
: {
: MyDelegate dl = DelegateMethod;
: dl.BeginInvoke(, new AsyncCallback(ar =>
: {
: string result = dl.EndInvoke(ar);
: Console.WriteLine("result: {0}", result);
: }), null);
: for (int i = ; i < ; i++)
: {
: Console.Write(".");
: Thread.Sleep();
: }
: }

BeginInvoke方法的最后一个参数可以用IAsyncResult的AsyncState属性获取。

参考资料:《C#高级编程》

第六种:C#异步编程的实现方式(5)——连续任务

如需学习,请异步原作者博客查看。

C#异步编程研究学习(一)的更多相关文章

  1. async 和 await 之异步编程的学习

    async修改一个方法,表示其为异步方法.而await表示等待一个异步任务的执行.js方面,在es7中开始得以支持:而.net在c#5.0开始支持.本文章将分别简单介绍他们在js和.net中的基本用法 ...

  2. 深入理解 Python 异步编程(上)

    http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...

  3. 【专栏学习】APM——异步编程模型(.NET不推荐)

    (1)learning hard C#学习笔记 异步1:<learning hard C#学习笔记>读书笔记(20)异步编程 (2)<C# 4.0 图解教程> 22.4 异步编 ...

  4. C# 异步编程学习(一)

    异步 编程 可在 等待 某个 任务 完成时, 避免 线程 的 占用, 但要 想 正确地 实现 编程, 仍然 十分 伤脑筋. . NET Framework 中, 有三种 不同 的 模型 来 简化 异步 ...

  5. 《learning hard C#学习笔记》读书笔记(20)异步编程

      20.1 什么是异步编程异步编程就是把耗时的操作放进一个单独的线程中进行处理. 20.2 同步方式存在的问题   namespace 异步编程 { public partial class For ...

  6. NodeJS学习之异步编程

    NodeJS -- 异步编程 NodeJS最大的卖点--事件机制和异步IO,对开发者并不透明 代码设计模式 异步编程有很多特有的代码设计模式,为了实现同样的功能,使用同步方式和异步方式编写代码会有很大 ...

  7. 【nodejs学习】3.进程管理及异步编程

    进程管理 1.调用终端命令实现目录目录拷贝 var child_procress = require('child_procress'); var util = require('util'); fu ...

  8. ES6/7 异步编程学习笔记

    前言 在ES6的异步函数出现之前,Js实现异步编程只有settimeout.事件监听.回调函数等几种方法 settTmeout 这种方法常用于定时器与动画的功能,因为其本质上其实是浏览器的WebAPI ...

  9. nodejs学习笔记 —— 异步编程解决方案

    在js或者node编程中,由于异步的频繁和广度使用,使得回调和嵌套的深度导致编程的体验遇到一些挑战,如果写出优雅和好看的代码,本文主要针对异步编程的主流方案做一些总结 1.事件发布/订阅模式 事件监听 ...

随机推荐

  1. openLdap安装教程

    环境 操作系统:centOS 7.0 OpenLDAP:2.4.X 安装 从yum源安装 yum install openldap openldap-servers openldap-clients ...

  2. 认识Redis持久化

    一:为什么需要持久化 因为Redis是一个完全使用内存来存储数据的数据库,如果机器突然断电.服务器重启或进程挂掉了等等原因,那么存储在Redis中的数据就会丢失,从而引起业务的损失.为了保证存储在内存 ...

  3. 微信小程序动画:高度渐变,left渐变

    今天在测试微信小程序动画的时候遇到了坑,需求是这样的点击时子元素从外部滑动回来,父元素的高度跟随子元素的高度改变. 实现子元素left为0并不复杂,但是改变父元素box的高度的时候却遇到了坑,因为是需 ...

  4. input.validity

    HTML5为表单提供了自带的输入规则提示 但是实际开发中,我们往往需要自定义提示消息和规则,例如限定了最大值但不要求超出时提示错误信息,这时便用到了H5提供的表单新的JS属性--validity,它是 ...

  5. Postman接口测试:自动获取登录后的cookie并设置环境变量

    在对网站进行接口测试的时候,很多请求往往是需要带登录的cookie才能请求成功的,一般来说,可以用抓包软件(fiddler,浏览器的F12)来查看登录后的cookie,并把它设置到postman的环境 ...

  6. Django路由系统-URLconf配置、正则表达式简述

    Django路由系统 1.11版本官方文档 ​ URL配置就像是Django项目的目录,它的本质是URL与URL调用的函数之间的映射表,Django会根据URL配置,在遇到一个URL时,就去执行相应的 ...

  7. 如何为Redis中list中的项设置过期时间

    问题 两种解决方法 有序集合 多个集合以及TTL Redis是一个伟大的工具,用来在内存中存储列表是很合适的. 不过,如果你想要快速搜索列表,同时需要让列表中每项都在一定时间后过期,应该怎么做呢? 首 ...

  8. OpenStack组件——Neutron网络服务(2)

    1.虚拟机获取 ip 1)用 namspace 隔离 DHCP 服务 Neutron 通过 dnsmasq 提供 DHCP 服务,而 dnsmasq 通过 Linux Network Namespac ...

  9. KVM虚拟化原理

    CPU虚拟化 KVM虚拟化是需要硬件支持的.我们可以用 egrep -o '(vmx|svm)' /proc/cpuinfo 来查看是否支持CPU虚拟化. 虚拟机中每一个vCPU对应qemu-kvm中 ...

  10. C#实现多线程的方法:线程(Thread类)和线程池(ThreadPool)

    简介 使用线程的主要原因:应用程序中一些操作需要消耗一定的时间,比如对文件.数据库.网络的访问等等,而我们不希望用户一直等待到操作结束,而是在此同时可以进行一些其他的操作.  这就可以使用线程来实现. ...