首先,我們分析一下異步處理的環境
需要在當前線程中獲取返回值
不需要在當前線程中獲取返回值,但是仍然需要對返回值做處理
對於第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 users 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 users 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 users 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 users 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 users input");
15 Console.WriteLine(caller.EndInvoke(result));
16 Console.ReadLine(