博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#异步调用的几种方式
阅读量:5833 次
发布时间:2019-06-18

本文共 4523 字,大约阅读时间需要 15 分钟。

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

需要在当前线程中获取返回值

不需要在当前线程中获取返回值,但是仍然需要对返回值做处理
对于第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

 

转载于:https://www.cnblogs.com/wwwzzg168/p/3569156.html

你可能感兴趣的文章
uva748 - Exponentiation
查看>>
Xamarin调用谷歌地图以及百度地图api key申请时的SHA1值
查看>>
洗礼灵魂,修炼python(69)--爬虫篇—番外篇之feedparser模块
查看>>
看起来很懵的java内存加载面试题
查看>>
struts2的OGNL的使用详解
查看>>
python set type 集合类型的数据介绍 (set frozenset)
查看>>
Spring整合CXF webservice restful 实例
查看>>
redis_3 持久化
查看>>
ASP Request.ServerVariables 参数集
查看>>
HDU 1392 Surround the Trees(凸包)题解
查看>>
POJ 1743 Musical Theme(后缀数组 + 二分)题解
查看>>
C#获取当前路径
查看>>
杭电1239--Calling Extraterrestrial Intelligence Again
查看>>
JAVA开发环境安装配置
查看>>
表格结构
查看>>
hdu3622 2-sat问题,二分+判断有无解即可。
查看>>
poj2117求割点后最多的块。
查看>>
hdu3491最小割转最大流+拆点
查看>>
DNS开源服务器BIND最小配置详解
查看>>
UVA 11468 Substring (AC自动机)
查看>>