<code>using</code> <code>System;</code>
<code>using</code> <code>System.Collections.Generic;</code>
<code>using</code> <code>System.Linq;</code>
<code>using</code> <code>System.Text;</code>
<code>using</code> <code>System.Threading;</code>
<code> </code>
<code>namespace</code> <code>ConsoleApplication1</code>
<code>{</code>
<code> </code><code>class</code> <code>Program</code>
<code> </code><code>{</code>
<code> </code><code>static</code> <code>void</code> <code>Main(</code><code>string</code><code>[] args)</code>
<code> </code><code>{</code>
<code> </code><code>Console.WriteLine(</code><code>"Main ThreadId = "</code> <code>+ Thread.CurrentThread.ManagedThreadId);</code>
<code> </code><code>//給委托指派</code>
<code> </code><code>Func<</code><code>long</code><code>,</code><code>long</code><code>> delegateMethod =</code><code>new</code> <code>Func<</code><code>long</code><code>,</code><code>long</code><code>>(CalcSum);</code>
<code> </code><code>//異步執行委托,這裡把委托本身作為asyncState對象傳進去,在回調函數中需要使用委托的EndInvoke來獲得結果</code>
<code> </code><code>delegateMethod.BeginInvoke(200, DoneCallback, delegateMethod);</code>
<code> </code><code>//異步執行委托,抛出異常</code>
<code> </code><code>delegateMethod.BeginInvoke(10000000000, DoneCallback, delegateMethod);</code>
<code> </code><code>Console.ReadLine();</code>
<code> </code><code>}</code>
<code> </code><code>//委托回調函數</code>
<code> </code><code>static</code> <code>void</code> <code>DoneCallback(IAsyncResult asyncResult)</code>
<code> </code><code>//到這兒委托已經在異步線程中執行完畢</code>
<code> </code><code>Console.WriteLine(</code><code>"DoneCallback ThreadId = "</code> <code>+ Thread.CurrentThread.ManagedThreadId);</code>
<code> </code><code>Func<</code><code>long</code><code>,</code><code>long</code><code>> method = (Func<</code><code>long</code><code>,</code><code>long</code><code>>)asyncResult.AsyncState;</code>
<code> </code><code>//委托執行的異常會在EndInvoke時抛出來</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>//使用BeginInvoke時傳入委托的EndInvoke獲得計算結果,這時候計算結果已經出來了,有異常的話也在這兒抛出來</code>
<code> </code><code>long</code> <code>sum = method.EndInvoke(asyncResult);</code>
<code> </code><code>Console.WriteLine(</code><code>"sum = {0}"</code><code>,sum);</code>
<code> </code><code>}</code>
<code> </code><code>catch</code> <code>(OverflowException)</code>
<code> </code><code>{</code>
<code> </code><code>Console.WriteLine(</code><code>"運算溢出了"</code><code>);</code>
<code> </code><code>//委托方法</code>
<code> </code><code>static</code> <code>long</code> <code>CalcSum(</code><code>long</code> <code>topLimit)</code>
<code> </code><code>//委托在另一個線程中開始執行</code>
<code> </code><code>Console.WriteLine(</code><code>"Calc ThreadId = "</code> <code>+ Thread.CurrentThread.ManagedThreadId);</code>
<code> </code><code>checked</code>
<code> </code><code>long</code> <code>result = 0;</code>
<code> </code><code>for</code> <code>(</code><code>long</code> <code>i = 0; i < topLimit; i++)</code>
<code> </code><code>{</code>
<code> </code><code>result += i;</code>
<code> </code><code>}</code>
<code> </code><code>return</code> <code>result;</code>
<code> </code><code>}</code>
<code>}</code>