天天看點

使用BeginInvoke,EndInvoke異步調用委托

<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&lt;</code><code>long</code><code>,</code><code>long</code><code>&gt; delegateMethod =</code><code>new</code> <code>Func&lt;</code><code>long</code><code>,</code><code>long</code><code>&gt;(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&lt;</code><code>long</code><code>,</code><code>long</code><code>&gt; method = (Func&lt;</code><code>long</code><code>,</code><code>long</code><code>&gt;)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 &lt; 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>

繼續閱讀