.NET多線程知識你問我答

讀後總結:
1. 爲什麼要有應用程序域(AppDemain)這個概念?
都知道每一個進程間都是相互隔離的,所有在進程間通訊是非常麻煩的事,.NET爲了能夠解決進程間的通信問題,推出了一個新的概念。於是.NET多個進程可以運行在同一個應用程序域中,這樣不同應用程序域之間可以相互隔離,做到了安全性,同時降低了進程間通信的難度。
2. 爲什麼要用多線程?
如果只有一個CPU的情況下,我們知道多線程也是有一個CPU去執行的,並且一次只能執行單個線程,通過時間片的切換來根據線程的優先級輪流執行線程。但是時間片的切換也是需要消耗資源的,所以爲什麼用多個線程?其實在某些情況下,多個線程可以提供系統的性能。比如:在系統請求大容量的數據時使用多線程,把數據輸出工作交給異步線程,使主線程保持其穩定性去處理其他問題。
3. 前臺線程和後臺線程對程序有什麼影響?
Thread.Start()啓動的線程默認爲前臺線程,而系統必須等待所有前臺線程運行結束後,應用程序域纔會自動卸載。線程Thread有一個屬性IsBackground,通過把此屬性設置爲true,就可以把線程設置爲後臺線程!這時應用程序域將在主線程完成時就被卸載,而不會等待異步線程的運行。當時如果主線程等待其後臺線程完成後再結束,這就會用到thread.Join()
4. CLR的線程池是怎樣工作的? 
CLR線程池並不會在CLR初始化的時候立刻建立線程,而是在應用程序要創建線程來執行任務時,線程池才初始化一個線程。線程的初始化與其他的線程一樣。在完成任務以後,該線程不會自行銷燬,而是以掛起的狀態返回到線程池。直到應用程序再次向線程池發出請求時,線程池裏掛起的線程就會再度激活執行任務。這樣既節省了建立線程所造成的性能損耗,也可以讓多個任務反覆重用同一線程,從而在應用程序生存期內節約大量開銷。
5. 當利用線程池ThreadPool.QueueUserWorkItem(WaitCallback,Object) 去調用多線程時,可以看到QueueUserWorkItem只能傳一個參數,並且沒有返回值,那麼怎樣實現傳多個參數和帶返回值的異步調用呢?
可以利用Delegate實現帶有多個參數和返回值的異步調用。
6. 當利用Delegate實現線程的異步時,怎樣監控運行多個對象已經完成?
監控一個對象已經完成,可以用的IAsyncResult.WaitHandle.WaitOne函數,但是監控多個運行對象時,WaitHandle準備了另外兩個靜態方法:WaitAny(waitHandle[], int)與WaitAll (waitHandle[] , int)。
7. 怎樣利用Delegate完成異步調用?
一是用輪詢的方式去判斷異步是否完成,比如
             //建立委託
             MyDelegate myDelegate = new MyDelegate(Hello);
             //異步調用委託,獲取計算結果
             IAsyncResult result=myDelegate.BeginInvoke("Leslie", null, null);
             //在異步線程未完成前執行其他工作
             while (!result.IsCompleted)
             {
                 Thread.Sleep(200);      //主線程操作
                 Console.WriteLine("Main thead do work!");
             }
             string data=myDelegate.EndInvoke(result);
二是用它的回調函數
 MyDelegate myDelegate = new MyDelegate(Hello);
 myDelegate.BeginInvoke("kntao", new AsyncCallback(Completed), null);
8.請舉例CLR線程池的I/O線程操作?
I/O 線程是.NET專爲訪問外部資源所設置的一種線程,因爲訪問外部資源常常要受到外界因素的影響,爲了防止讓主線程受影響而長期處於阻塞狀態,.NET爲多個I/O操作都建立起了異步方法,例如:FileStream、TCP/IP、WebRequest、WebService等等,而且每個異步方法的使用方式都非常類似,都是以BeginXXX爲開始,以EndXXX結束,
9.怎樣避免多線程操作同一數據?
.NET提供了lock、Monitor、Interlocked等多個鎖定數據的方式。
發佈了117 篇原創文章 · 獲贊 24 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章