C# 非同步函式呼叫

最近在CodeProject看到一篇文章,在討論C#中的非同步函式呼叫(Asynchrous Method Invoke)。這篇文章中對BeginInvoke()/EndInvoke()的非同步呼叫說明的非常詳細,而且也用了很多程式碼範例來輔助說明。

其中它有證明說在使用BeginInvoke()這種非同步函式呼叫方式時,它當然會需要使用到執行緖,所以它會用到的就是C#中的ThreadPool。要確認目前執行的程式碼是否在ThreadPool的執行緒中執行的話,可以用:

Thread.CurrentThread.IsThreadPoolThread

這個屬性來確認。

使用ThreadPool當然有它的好處,因為它可以限制同一時間最多只會使用到某一定量的執行緒。這樣就不會因為同時間有太多的執行緒在執行,造成CPU秏費過多的時間在執行緒間進行切換(ContextSwitch)。

不過,使用ThreadPool的執行緒時,要小心一點,就是不要一直佔用執行緒不放。例如有一項工作會等到預訂的時間才開始進行的話,那一般就會用Thread.Sleep()一段時間後,再接續執行。而在Thread.Sleep()時,CPU的執行時間雖然會被切換給其它執行緒來執行。可是您用來Sleep()等待的執行緒此時也被您給佔住了。造成ThreadPool中可用的執行緒就會少一個。

這種情形一多的話,說不定就會用光ThreadPool中的執行緒,而造成後續的工作都無法處理。

留言

  1. Reliable Freelance Blogging Return
    There are hundreds of sites that put up for sale to commerce a conceivability to procure money looking for your hard work. Not every one wants to take a chance. Our qualified blogging program is fair-minded rational for the herself who has a aged level of facility and wants to send a letter articles on a part-time basis. With this program, you are universal to journey by paid. You don’t maintain to unintentional whether or not you commitment make an profits like many other provocation opportunities online.
    payday loans payday loans payday loans

    回覆刪除

張貼留言

這個網誌中的熱門文章

DOS Batch指令檔中如何記錄log資訊

用捷徑方式執行需帶入命令列參數的Windows Form程式

使用regular expression來match中括號(square bracket)