哪吒2之魔童闹海|哪吒2之魔童归来免费观看|哪吒2在线观看|哪吒2魔童闹海电影免费观看|哪吒2免费观看完整版大电影|哪吒1免费观看完整版

新疆軟件開發(fā)

本站首頁 軟件開發(fā) 成功案例 公司新聞 公司簡介 客服中心 軟件技術 網站建設
  您現在的位置: 新疆二域軟件開發(fā)公司 >> .Net技術 >> 文章正文

教程:.Net多線程和Windows Forms編程

1 UI線程執(zhí)行耗時操作  UI線程被阻塞 無法響應窗體消息隊列中的其他消息。

2 非UI線程修改UI屬性 由于窗體資源也屬于臨界資源 所以有互斥訪問的機制。

3 線程的同步問題 線程A等待線程B執(zhí)行完畢后才能開始執(zhí)行。

問題1的解決方法:
解決方法只有一種,就是開啟新線程執(zhí)行耗時操作,使原界面線程仍能夠響應窗體消息隊列中的用戶消息及系統(tǒng)消息。

開啟新線程的方式有以下各種:
1) 使用System.Threading.Thread類與System.Threading.ThreadStart委托或System.Threading.ParameterizedThreadStart委托來實現開啟新線程。
ThreadStart委托的類型: void ThreadStart(void);
ParameterizedThreadStart委托的類型: void ParameterizedThreadStart(object[]);

ThreadStart委托可以指向一個無參數無返回值的方法。
ParameterizedThreadStart委托可以指向一個有參數無返回值的方法。

Thread類實例化的時候可以向構造函數傳入ThreadStart委托的實例或ParameterizedThreadStart委托的實例,然后使用Thread.Start()以異步方式調用一個方法。

2) 為需要異步執(zhí)行的耗時方法定義一個委托,使用該委托的實例的BeginInvoke方法來異步調用該方法,BeginInvoke方法附帶了AsyncCallback類型的回調函數委托以及object類型的參數。
然后可以在AsyncCallback類型的回調函數中使用EndInvoke方法來得到異步方法的返回值。

3) 可以使用System.Timers.Timer定時器類來實現在新線程中執(zhí)行耗時操作,System.Timers.Timer定時器不同于System.Windows.Forms.Timer定時器,System.Timers.Timer定時器的定時事件的響應函數并不是在調用定時器Start方法的線程中去執(zhí)行。

4) 可以使用BackgroundWorker組件來實現在新線程中執(zhí)行耗時操作(通過訂閱DoWork事件).


問題2的解決方法
以下代碼是.NetFramework 2.0類庫中避免多線程修改界面造成的臨界資源死鎖問題的代碼。
System.Windows.Forms.Control.get_Handle方法的內部實現

public IntPtr get_Handle()
{
    if ((checkForIllegalCrossThreadCalls && !inCrossThreadSafeCall) && this.InvokeRequired)
    {
        throw new InvalidOperationException(SR.GetString("IllegalCrossThreadCall", new object[] { this.Name }));
    }
    if (!this.IsHandleCreated)
    {
        this.CreateHandle();
    }
    return this.HandleInternal;
}



在修改每個控件的屬性的時候,都會先調用get_Handle方法獲取一個操作句柄,在該方法內部會判斷Control類的靜態(tài)成員CheckForIllegalCrossThreadCalls的值(該成員用來表示是否啟用安全模式,安全模式的意思就是禁止跨線程修改界面屬性來避免多線程訪問臨界資源死鎖的問題),第二個判斷的屬性是InvokeRequired屬性(該屬性用來表示當前方法是否是在跨線程調用)。 所以我們可以通過修改CheckForIllegalCrossThreadCalls屬性為False來關閉安全模式,但有可能造成線程死鎖問題。

解決方法只有兩個
1) 設置CheckForIllegalCrossThreadCalls屬性為False,關閉.net的安全模式,在對界面屬性修改的代碼加上lock,來實現同一時間僅有一個線程修改界面屬性。
2) 在設置界面屬性的方法中詢問InvokeRequired屬性,如果是非界面線程修改界面屬性,則讓界面線程來調用設置界面屬性的方法。(這個方法是MSDN實例中慣用的方法,也是BackgroundWorker等組件的內部實現方式)


推薦大家使用BackgroundWorker來實現耗時操作的輔助線程以及跨線程修改界面屬性等操作,關于BackgroundWorker的具體使用方法見 一日一練 之 BackgroundWorker

作者:未知 | 文章來源:自學編程網 | 更新時間:2007-12-29 12:38:59

  • 上一篇文章:

  • 下一篇文章:

  • 相關文章:
    j2se 嵌入式腳本抓取引擎
    NET Framework 2.0 Service Pack 2下載地址
    Java語言學習:jAVA中 的多線程淺析
    解析.NET中的6各大的安全錯誤
    java多線程SOCKET程序的問題
    .NET中Boolean,bool以及String,string之間的區(qū)別
    在VC 程序中自定義Vista事件日志
    .Net FrameWork 2.0 新增功能 Bulk Copy
    多線程技術在.net中是如何應用的
    C++函數對象count_if
    軟件技術
    · 開發(fā)語言
    · Java技術
    · .Net技術
    · 數據庫開發(fā)
    最新文章  
    ·.net技術 asp.net MVC3 Vi
    ·.net將視頻文件格式轉換成
    ·NET Framework 2.0 Servic
    ·如何動態(tài)修改winform的app
    ·asp,net軟件結構設計和相關
    ·學習怎樣使用ASP.NET中的虛
    ·,net基礎類的學習:system
    ·.net學習:c#事件的深入分
    ·Facade Pattern學習總結
    ·C#如何設置或者獲取目錄的
    ·如何使用XSL來定義ASP.NET
    ·理解WCF Data Contract契約
    ·如何能在.net2.0開發(fā)的控件
    ·模式怎樣使用,講解模式的
    ·如何解決Menu菜單被frame遮
    關于我們 | 軟件開發(fā) | 下載試用 | 客服中心 | 聯系我們 | 友情鏈接 | 網站地圖 | 新疆電子地圖 | RSS訂閱
    版權所有 © 2016 新疆二域軟件開發(fā)網 www.pg11qqq.com All Rights Reserved 新ICP備14003571號
    新疆軟件開發(fā)總機:0991-4842803、4811639.
    客服QQ:596589785 ;地址:新疆烏魯木齊北京中路華聯大廈A-5C 郵編:830000