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

需要在当前线程中获取返回值
不需要在当前线程中获取返回值,但是仍然需要对返回值做处理
对于第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. Spring读书笔记——bean加载

    我们的日常开发几乎离不开Spring,他为我们的开发带来了很大的便捷,那么Spring框架是如何做到方便他人的呢.今天就来说说bean如何被加载加载. 我们在xml文件中写过太多类似这样的bean声明 ...

  2. Revit二次开发初体验

    最近换了下工作,由之前的互联网企业转入了BIM软件开发行列.具体原因不多说,作为一个程序员来说学习永无止境.下面来一个Hello World体验下Revit的二次开发 事前准备 VS Revit 20 ...

  3. LeetCode-Palindromic Substrings

    package Classify.DP.Medium; import org.junit.jupiter.api.Test; public class PalindromicSubstrings { ...

  4. javascript字符串对象

    String字符串对象 1. 字符串粗体展示: var a = "陈冠希喜欢拍电影";   document.writeln(a.bold()+"<br/>& ...

  5. springboot mybatis优雅的添加多数据源

    springboot的原则是简化配置,本文试图不通过xml配置,使用configuration配置数据源,并进行简单的数据访问. 并且配置了多数据源,在开发过程中这种场景很容易遇到. 1.依赖 spr ...

  6. Virgo标签打印

    去年刚换新的公司,熟悉新的业务和代码,在修改公司打印标签的时候,感觉到无比烦躁与头痛.只因为不好维护,所有的标签打印,全部是GDI+绘制,每次修改微调,都只能全部运行才能看到效果.程序过大,编译过慢, ...

  7. 【学习】js学习笔记---数组对象

    一.属性 length 数组的大小.数组的length属性总是比数组中定义的最后一个元素的下标大一,设置属性length的值可以改变数组的大小.如果设置的值比它的当前值小,数组将被截断,其尾部的元素将 ...

  8. 【学习】js学习笔记:对象的遍历和封装特性

    1.对象的属性访问: 对象.属性 对象[属性],但中括号中必须是字符串 2.属性的遍历: for in方法举例: var ren={}; ren.name="名字"; ren.ea ...

  9. 用javascript和html5做一个音乐播放器,附带源码

    效果图: 实现的功能 1.首页 2.底部播放控件 3.播放页面 4.播放列表 5.排行榜 6.音乐搜索 输入搜索关键词,点击放大镜图标 7.侧边栏 目录结构 开发心得与总结 1.轮播图 首先感谢作者S ...

  10. win10 uwp 自定义控件初始化

    我遇到一个问题,我在 xaml 用了我的自定义控件,但是我给他设置了一个值,但是什么时候我才可以获得这个值? 本文告诉大家,从构造函数.loaded.Initialized 的调用过程. 用最简单的方 ...