C# WinForm開發系列 – Thread/Delegate/Event

來源:互聯網
上載者:User
     C#是一門支援多線程的語言,因此線程的使用也是比較常見的。由於線程的知識在Win32編程的時候已經說得過多,所以在.Net中很少介紹這部分(可能.Net不覺得這部分是它所特有的)。那我們為什麼要使用多線程? 應該什麼時候使用它呢?

為什麼使用多線程?

1.耗時的操作使用線程,提高應用程式響應

2.並行操作時使用線程,如C/S架構的伺服器端並發線程響應使用者的請求。

3.多CPU系統中,使用線程提高CPU利用率

4.改善程式結構。一個既長又複雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分,這樣的程式會利於理解和修改。
其他情況都使用單線程。

老趙在其文章正確使用非同步作業中總結了下面幾類操作使用多線程,可以提高效能,如檔案操作,網路通訊,Web請求調用等:

  • FileStream操作:BeginRead、BeginWrite。調用BeginRead/BeginWrite時會發起一個非同步作業,但是只有在建立FileStream時傳入FileOptions.Asynchronous參數才能擷取真正的IOCP支援,否則BeginXXX方法將會使用預設定義在Stream基類上的實現。Stream基類中BeginXXX方法會使用委託的BeginInvoke方法來發起非同步呼叫——這會使用一個額外的線程來執行任務。雖然當前調用線程立即返回了,但是資料的讀取或寫入操作依舊佔用著另一個線程(IOCP支援的非同步作業時不需要線程的),因此並沒有任何“節省”,反而還很有可能降低了應用程式的效能,因為額外的線程切換會造成效能損失。
  • DNS操作:BeginGetHostByName、BeginResolve。
  • Socket操作:BeginAccept、BeginConnect、BeginReceive等等。
  • WebRequest操作:BeginGetRequestStream、BeginGetResponse。
  • SqlCommand操作:BeginExecuteReader、BeginExecuteNonQuery等等。這可能是開發一個Web應用時最常用的非同步作業了。如果需要在執行資料庫操作時得到IOCP支援,那麼需要在連接字串中標記Asynchronous Processing為true(預設為false),否則在調用BeginXXX操作時就會拋出異常。
  • WebServcie叫用作業:例如.NET 2.0或WCF產生的Web Service Proxy中的BeginXXX方法、WCF中ClientBase<TChannel>的InvokeAsync方法。

     

    CSDN愚翁專欄部落格文章第一期總結之三:Thread的問題總結了下面一些問題,感覺自己在開發中都有遇到,挺不錯的一篇文章

    那麼線程相關的問題大致有如下四類(這篇文章只討論單線程、單線程與UI線程這兩方面的問題)。

    問題一,線程的基本操作,例如:暫停、繼續、停止等;

    問題二,如何向線程傳遞參數或者從中得到其傳回值;

    問題三,如何使線程所佔用的CPU不要老是百分之百;

    最後一個,也是問題最多的,就是如何在子線程來控制UI中的控制項,換句話說,就是線上程中控制表單某些控制項的顯示。

    還有CSDN論壇文章[★]WinForm中,主線程如何優雅的控制子線程?

     

    2. 園友們也有不少關於多線程的文章,收藏一下(不斷更新, 慢慢補充)

     朱燚 .Net多線程總結(一)   .Net多線程總結(二)-BackgroundWorker

    .Net線程問題解答

    把遇到過的對.Net線程的一些問題和誤解集中起來和大家分享,也希望大家能一起補充,熱烈歡迎討論


    目錄


     

    基礎篇

    • 怎樣建立一個線程
    • 受託管的線程與 Windows線程
    • 前台線程與後台線程
    • 名為BeginXXX和EndXXX的方法是做什麼用的
    • 非同步和多線程有什麼關聯

    WinForm多線程編程篇

    • 我的多線程WinForm程式老是拋出InvalidOperationException ,怎麼解決?
    • Invoke,BeginInvoke幹什麼用的,內部是怎麼實現的
    • 每個線程都有訊息佇列嗎?
    • 為什麼Winform不允許跨線程修改UI線程式控制件的值
    • 有沒有什麼辦法可以簡化WinForm多線程的開發

    線程池

    • 線程池的作用是什麼?
    • 所有進程使用一個共用的線程池,還是每個進程使用獨立的線程池?
    • 為什麼不要手動線程池設定最大值?
    • .Net線程池有什麼不足?

    同步

    • CLR怎樣實現lock(obj)鎖定?
    • WaitHandle是什麼,他和他的衍生類別怎麼使用
    • 什麼是用雙鎖實現Singleton,為什麼要這樣做,為什麼有人說雙鎖檢驗是不安全的
    • 互斥對象(Mutex)、事件(Event)對象與lock語句的比較

    什麼時候需要鎖定

    • 只有共用資源才需要鎖定
    • 把鎖定交給資料庫
    • 瞭解你的程式是怎麼啟動並執行
    • 商務邏輯對事務和安全執行緒的要求
    • 計算一下衝突的可能性
    • 請多使用lock,少用Mutex

    Web和IIS

    • 應用程式集區,WebApplication,和線程池之間有什麼關係
    • Web頁面怎麼調用非同步WebService

     

    沒有暱稱 在.Net中使用非同步(一) 在.Net中使用非同步(二)

    idior  Delegate比較全面的例子(原創)  非同步Socket  HashTable的執行緒安全性

    .Net2.0 的新線程 ParameterizedThreadStart &BackgroundWorker

    wuhang 轉載來的,線程的基礎   轉載來的WinForm多線程編程篇  依舊是轉載來的Thread and Sync In C# (C#中的線程與同步)

    小y  線程和Application.DoEvents()

    BugHunter C# 中的委託  自訂線程池-c#的簡單實現

    清雷 一個封裝的非同步Socket用戶端

    牧野  .NET Socket開發之非同步Socket

    Shawn.Nie C#中Socket多線程編程執行個體 [轉載]

  • 寒蟬 [轉]如何智能用戶端應用程式效能

  • EricWen  C#非同步編程

  • Qim C#非同步資料處理及進度顯示

  • today   打造迅速響應的使用者介面

  • Net66  通過多線程為基於 .NET 的應用程式實現響應迅速的使用者  銜接UI線程和管理後台背景工作執行緒的類(多線程、非同步呼叫)

  • 破寶   .NET 事件模型教程(一)  .NET 事件模型教程(二)  .NET 事件模型教程(三)

  • hertcloud的專欄   C# 一個多線程操作控制項的例子

  • 飛雪飄寒  委託與事件——系列文章收藏 (很全面, 推薦)

    3. 其它網路資源

    C#中的多線程   在.NET用戶端程式中使用多線程(一)   在C#中編寫多線程應用程式

    C# 如何:對Windows 表單控制項進行安全執行緒調用

  • 如果你不想在網上一一瀏覽相關部落格文章, 我手頭整理了一份電子版(PDF), 可供大家學習參考, 好像有點大, 宿舍網速不行, 大家直接留言向我索取吧發郵箱.
    相關文章代碼著作權屬於原作者, 僅供學習參考.總算上傳上來了, 下載編程資料 - 多線程篇.pdf.

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.