首先,我们分析一下异步处理的环境

需要在当前线程中获取返回值
不需要在当前线程中获取返回值,但是仍然需要对返回值做处理
对于第1中情况,还可以继续细分

在当前线程中启动线程T,然后继续执行当前线程中的其它任务,最后在当前线程中获取T的返回值
在当前线程中启动线程T,然后继续执行当前线程中的其它任务R1,等待T执行完成,当T执行完成后,继续执行当前线程中的其它任务R2,最后获取T的返回值
在当前线程中启动线程T,只要T在执行就执行任务R,最后获取T的返回值
下面,我将一一给出例子:

1.1 在当前线程中启动线程T,然后继续执行当前线程中的其它任务,最后在当前线程中获取T的返回值
view sourceprint?01 using System;

02 using System.Collections.Generic;

03 using System.Linq;

04 using System.Windows.Forms;

05 using System.Threading;

06 using System.Runtime.Remoting.Messaging;

07 namespace FirstWF

08 {

09     static class Program

10     {

11         /// <summary>

12         /// The main entry point for the application.

13         /// </summary>

14         [STAThread]

15         static void Main()

16         {

17             AsyncFuncDelegate caller = new AsyncFuncDelegate(Func);

18             Console.WriteLine("Input number please...");

19             IAsyncResult result = caller.BeginInvoke(Convert.ToInt32(Console.ReadLine()), null, null);

20             Console.WriteLine("Implement other tasks");

21             Thread.Sleep(7000);

22             Console.WriteLine("Implement other tasks end ...");

23             Console.WriteLine("Get user's input");

24             Console.WriteLine(caller.EndInvoke(result));

25             Console.ReadLine();

26         }

27         delegate string AsyncFuncDelegate(int userInput);

28         static string Func(int userInput)

29         {

30             Console.WriteLine("Func start to run");

31             Console.WriteLine("...");

32             Thread.Sleep(5000);

33             Console.WriteLine("Func end to run");

34             return userInput.ToString();

35         }

36     }

37 }

输出结果如下:

Implement other tasks

Func start to run

...

Func end to run

Implement other tasks end ...

Get user's input

56

1.2 在当前线程中启动线程T,然后继续执行当前线程中的其它任务R1,等待T执行完成,当T执行完成后,继续执行当前线程中的其它任务R2,最后获取T的返回值
view sourceprint?01 static void Main()

02         {

03             AsyncFuncDelegate caller = new AsyncFuncDelegate(Func);

04             Console.WriteLine("Input number please...");

05             IAsyncResult result = caller.BeginInvoke(Convert.ToInt32(Console.ReadLine()), null, null);

06             Console.WriteLine("Implement task 1");

07             result.AsyncWaitHandle.WaitOne();

08             result.AsyncWaitHandle.Close();

09             Console.WriteLine("Implment task 2");

10             Console.WriteLine("Get user's input");

11             Console.WriteLine(caller.EndInvoke(result));

12             Console.ReadLine();

13         }

输出结果如下:

Input number please...

25

Implement task 1

Func start to run

...

Func end to run

Implment task 2

Get user's input

25

1.3 在当前线程中启动线程T,只要T在执行就执行任务R,最后获取T的返回值
view sourceprint?01 [STAThread]

02         static void Main()

03         {

04             AsyncFuncDelegate caller = new AsyncFuncDelegate(Func);

05             Console.WriteLine("Input number please...");

06             IAsyncResult result = caller.BeginInvoke(Convert.ToInt32(Console.ReadLine()), null, null);

07             while (!result.IsCompleted)

08             {

09                 Thread.Sleep(1000);

10                 Console.Write(">");

11             }

12             Console.WriteLine("");

13             Console.WriteLine("Implement other task2");

14             Console.WriteLine("Get user's input");

15             Console.WriteLine(caller.EndInvoke(result));

16             Console.ReadLine();

17         }

输出结果如下:

Func start to run

...

>>>>>Func end to run

>

Implement other task2

Get user's input

23

2 不需要在当前线程中获取返回值,但是仍然需要对返回值做处理

view sourceprint?01 using System;

02 using System.Collections.Generic;

03 using System.Linq;

04 using System.Windows.Forms;

05 using System.Threading;

06 using System.Runtime.Remoting.Messaging;

07 namespace FirstWF

08 {

09     static class Program

10     {

11         /// <summary>

12         /// The main entry point for the application.

13         /// </summary>

14         [STAThread]

15         static void Main()

16         {

17             AsyncFuncDelegate caller = new AsyncFuncDelegate(Func);

18             Console.WriteLine("Input number please...");

19             caller.BeginInvoke(Convert.ToInt32(Console.ReadLine()), new AsyncCallback(CallBackFunc), "Message from Main thread.");

20             Console.WriteLine("Main thread ends");

21             Console.ReadLine();

22         }

23         delegate string AsyncFuncDelegate(int userInput);

24         static string Func(int userInput)

25         {

26             Console.WriteLine("Func start to run");

27             Console.WriteLine("...");

28             Thread.Sleep(5000);

29             Console.WriteLine("Func end to run");

30             return userInput.ToString();

31         }

32         static void CallBackFunc(IAsyncResult ar)

33         {

34             AsyncResult result = ar as AsyncResult;

35             string inputMessage = result.AsyncState as string;

36             AsyncFuncDelegate caller = result.AsyncDelegate as AsyncFuncDelegate;

37             Console.WriteLine("call back starts");

38             Console.WriteLine(inputMessage);

39             Console.WriteLine("The input number is : " + caller.EndInvoke(ar));

40             Console.WriteLine("call back ends");

41         }

42     }

43 }

输出结果如下:

Input number please...

23

Main thread ends

Func start to run

...

Func end to run

call back starts

Message from Main thread.

The input number is : 23

call back ends

c#异步调用的几种方式的更多相关文章

  1. 说说Java异步调用的几种方式

    日常开发中,会经常遇到说,前台调服务,然后触发一个比较耗时的异步服务,且不用等异步任务的处理结果就对原服务进行返回.这里就涉及的Java异步调用的一个知识.下面本文尝试将Java异步调用的多种方式进行 ...

  2. Java 异步编程的几种方式

    前言 异步编程是让程序并发运行的一种手段.它允许多个事情同时发生,当程序调用需要长时间运行的方法时,它不会阻塞当前的执行流程,程序可以继续运行,当方法执行完成时通知给主线程根据需要获取其执行结果或者失 ...

  3. DLL调用的两种方式(IDE:VC6.0,C++)

    原文:http://www.cnblogs.com/Pickuper/articles/2050409.html DLL调用有两种方式,一种是静态调用,另外一种是动态调用 (一)静态调用 静态调用是一 ...

  4. python 模块调用的几种方式

    在python里面又很多模块,或者引用第三方模块,python 模块调用的几种方式,下面详细解说 1,import 模块名 2,from 模块 import  模块里面的小功能 3,from  模块 ...

  5. 【整理】Ajax异步实现的几种方式总结

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术.GET ...

  6. JavaScript处理异步请求的几种方式(取异步函数返回值)

    JavaScript处理异步的几种方式 Javascript语言的执行环境是"单线程"(single thread,就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个 ...

  7. [OpenSource]浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份额,不管谁对谁错,Java和.Net是目前应用开发的两个 ...

  8. 浅谈.Net和Java互相调用的三种方式

    在很多的大型系统开发中,开发工具往往不限制于同一种开发语言,而是会使用多种开发语言的混合型开发.目前Java和.Net都声称自己占85%的市场份 额,不管谁对谁错,Java和.Net是目前应用开发的两 ...

  9. Struts2方法调用的三种方式

    在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="student" class="com.itmyho ...

随机推荐

  1. Nginx配置文件中文详解

    ######Nginx配置文件nginx.conf中文详解##### #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_ ...

  2. 干货|人人都是翻译项目的Master

    在平时的工作中,我们都会经常查阅一些英文文档来解决平时遇到的问题和拓宽视野.看到好的文章或者书籍有没有想要和小伙伴分享的冲动,那么我们一起来翻译吧- 翻译主张 "信 达 雅" .& ...

  3. LINUX下分区命令Parted详解

    通常划分分区工具我们用的比较多是fdisk命令,但是现在由于磁盘越来越廉价,而且磁盘空间越来越大.而fdisk工具他对分区是有大小限制的,它只能划分小于2T的磁盘.现在的磁盘空间已经远远大于2T,有两 ...

  4. JavaScript正则表达式实例汇总

    本文会持续更新 -------------------------------------------------------------------------------------------- ...

  5. <Mastering KVM Virtualization>:第四章 使用libvirt创建你的第一台虚拟机

    在第3章<搭建独立的KVM虚拟化>中,你安装并启动了libvirtd服务.你还引入了帮助你管理虚拟机的libvirt管理工具virt-manager和virsh. 相较于命令行,新用户总是 ...

  6. 本地idea调试spark2.x程序

    1.构建使用idea 构建maven 项目 选择org.scala-tools.archetypes:scala-archetype-simple,然后一直点next,maven最好选中本地配置国内源 ...

  7. highcharts框架使用总结

    Highcharts官网地址:https://www.hcharts.cn/products/highcharts首先需要引入jQuery框架,然后包含Highcharts框架需要使用到的js文件,最 ...

  8. swift 之SnapKit 动画

    这个问题纠结了我挺长时间的.一直以为把约束直接添加到动画里面就可以了.但是并没那么简单.-.-其实还是挺简 class ViewController: UIViewController { @IBOu ...

  9. 中高级JavaScript易错面试题

    写出下题的输出 1.函数的实参与形参length var length = 10; function fn() { console.log(this.length); } var obj = { le ...

  10. IsoAlgo3d - A PCF 3D Viewer for Desktop, Tablet and Smart phone

    IsoAlgo3d - A PCF 3D Viewer for Desktop, Tablet and Smart phone eryar@163.com Abstract. IsoAlgo3d 通过 ...