c#异步调用的几种方式

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

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