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

需要在当前线程中获取返回值
不需要在当前线程中获取返回值,但是仍然需要对返回值做处理
对于第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. hadoop(二)搭建伪分布式集群

    前言 前面只是大概介绍了一下Hadoop,现在就开始搭建集群了.我们下尝试一下搭建一个最简单的集群.之后为什么要这样搭建会慢慢的分享,先要看一下效果吧! 一.Hadoop的三种运行模式(启动模式) 1 ...

  2. Python自学笔记-logging模块详解

    简单将日志打印到屏幕: import logging logging.debug('debug message') logging.info('info message') logging.warni ...

  3. c# Linq操作XML,查找节点数据

    /*查找XML*/ var filePath = Server.MapPath("~/xml/sample.xml"); XDocument doc = XDocument.Loa ...

  4. windows2008(64位)下iis7.5中的url伪静态化重写(urlrewrite)

    以前在windows2003里,使用的是iis6.0,那时常使用的URL重写组件是iisrewrite,当服务器升级到windows2008R2时,IIS成了64位的7.5,结果iisreite组件是 ...

  5. 【特效】页面滚动到相应位置运行css3动画

    请到我的个人博客网站上浏览此文章,欢迎评论和建议. 文章链接:http://www.xiaoxianworld.com/archives/87 现在css3动画很常见了,实际项目中经常应用,特别是那种 ...

  6. JIRA-6.3.6安装与破解

    首先下载JIRA-6.3.6的安装包: wget http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-6.3. ...

  7. Java IO流 思维导图

  8. WordPress 4.8 安装配置教程 (基于 centos 7.3, php 7.0, mysql 5.7.19, nginx 1.12.1)

    最近想要整个 blog,记录自己工作.学习中的点滴.Wordpress 自然是首选,因为内容才是关键,所以也就不怕别人说太 low.网上大部份都是讲 wordpress 配合 apache 的安装教程 ...

  9. (转)Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

    原文出自:http://blog.csdn.net/anxpp/article/details/51512200 1.BIO编程 1.1.传统的BIO编程 网络编程的基本模型是C/S模型,即两个进程间 ...

  10. canvas绘制太阳系

    原文地址:http://jeffzhong.space/2017/10/26/solar/ 学习canvas有一段时间了,顺便写个小项目练手,该项目用到的知识点包括: ES6面向对象 基本的三角函数 ...