1

namespace Bingosoft.Training2007.CSharp
2
{
3
delegate int Sum(int num1,int num2);
4
/**//// <summary>
5
/// 使用Delegate的BeginInvoke方法完成一個函數的異步調用過程。
6
/// </summary>
7
class Question6
8
9
/**//// <summary>
10
/// 求兩個int型數的和(僅供示範)
11
/// </summary>
12
/// <param name="num1"></param>
13
/// <param name="num2"></param>
14
/// <returns></returns>
15
public static int GetSum(int num1, int num2)
16
17
Thread.Sleep(1000);
18
return num1 + num2;
19
}
20
21
22
/// 用EndInvoke等待異步調用
23
/// </summary>
24
public static void TestAsyn1()
25
26
Sum sum = new Sum(GetSum);
27
IAsyncResult result = sum.BeginInvoke(10, 20,null,null);
28
Console.WriteLine("計算中
");
29
int returnVal = sum.EndInvoke(result);
30
Console.WriteLine(returnVal);
31
32
33
34
/// 用WaitHandle等待異步調用
35
36
public static void TestAsyn2()
37
38
39
IAsyncResult result = sum.BeginInvoke(10, 20, null, null);
40
result.AsyncWaitHandle.WaitOne();
41
Console.WriteLine("計算完畢:");
42
43
44
45
46
47
/// 輪訓查詢等待異步調用
48
49
public static void TestAsyn3()
50
51
52
53
while (!result.IsCompleted)
54
55
Console.WriteLine("計算中
56
}
57
58
59
60
61
62
/// 異步調用完成後,執行回調
63
64
public static void TestAsyn4()
65
66
67
IAsyncResult result = sum.BeginInvoke(10, 20, new AsyncCallback(Question6.CallBackAsyn), sum);
68
69
70
71
72
/// 回調函數
73
74
/// <param name="ar"></param>
75
public static void CallBackAsyn(IAsyncResult ar)
76
77
Sum sum = (Sum)ar.AsyncState;
78
int returnVal = sum.EndInvoke(ar);
79
MessageBox.Show(returnVal.ToString(), "計算結果:", MessageBoxButtons.OK, MessageBoxIcon.Information);
80
}
81
}
82
}
83

84

85

//測試Question6
86

Question6.TestAsyn1();
87

Question6.TestAsyn2();
88

Question6.TestAsyn3();
89

Question6.TestAsyn4();