扒开腿挺进岳湿润的花苞视频|将军边走边挺进她H树林|挺进朋友人妻张婉莹身体|岳脱得精光让我挺进去视频|第一次挺进莹莹的身体里视频|脱岳裙子从后面挺进去视频

新疆軟件開(kāi)發(fā)

本站首頁(yè) 軟件開(kāi)發(fā) 成功案例 公司新聞 公司簡(jiǎn)介 客服中心 軟件技術(shù) 網(wǎng)站建設(shè)
  您現(xiàn)在的位置: 新疆二域軟件開(kāi)發(fā)公司 >> .Net技術(shù) >> 文章正文

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

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

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

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

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

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

ThreadStart委托可以指向一個(gè)無(wú)參數(shù)無(wú)返回值的方法。
ParameterizedThreadStart委托可以指向一個(gè)有參數(shù)無(wú)返回值的方法。

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

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

3) 可以使用System.Timers.Timer定時(shí)器類來(lái)實(shí)現(xiàn)在新線程中執(zhí)行耗時(shí)操作,System.Timers.Timer定時(shí)器不同于System.Windows.Forms.Timer定時(shí)器,System.Timers.Timer定時(shí)器的定時(shí)事件的響應(yīng)函數(shù)并不是在調(diào)用定時(shí)器Start方法的線程中去執(zhí)行。

4) 可以使用BackgroundWorker組件來(lái)實(shí)現(xiàn)在新線程中執(zhí)行耗時(shí)操作(通過(guò)訂閱DoWork事件).


問(wèn)題2的解決方法
以下代碼是.NetFramework 2.0類庫(kù)中避免多線程修改界面造成的臨界資源死鎖問(wèn)題的代碼。
System.Windows.Forms.Control.get_Handle方法的內(nèi)部實(shí)現(xiàn)

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;
}



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

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


推薦大家使用BackgroundWorker來(lái)實(shí)現(xiàn)耗時(shí)操作的輔助線程以及跨線程修改界面屬性等操作,關(guān)于BackgroundWorker的具體使用方法見(jiàn) 一日一練 之 BackgroundWorker

作者:未知 | 文章來(lái)源:自學(xué)編程網(wǎng) | 更新時(shí)間:2007-12-29 12:38:59

  • 上一篇文章:

  • 下一篇文章:

  • 相關(guān)文章:
    j2se 嵌入式腳本抓取引擎
    NET Framework 2.0 Service Pack 2下載地址
    Java語(yǔ)言學(xué)習(xí):jAVA中 的多線程淺析
    解析.NET中的6各大的安全錯(cuò)誤
    java多線程SOCKET程序的問(wèn)題
    .NET中Boolean,bool以及String,string之間的區(qū)別
    在VC 程序中自定義Vista事件日志
    .Net FrameWork 2.0 新增功能 Bulk Copy
    多線程技術(shù)在.net中是如何應(yīng)用的
    C++函數(shù)對(duì)象count_if
    軟件技術(shù)
    · 開(kāi)發(fā)語(yǔ)言
    · Java技術(shù)
    · .Net技術(shù)
    · 數(shù)據(jù)庫(kù)開(kāi)發(fā)
    最新文章  
    ·.net技術(shù) asp.net MVC3 Vi
    ·.net將視頻文件格式轉(zhuǎn)換成
    ·NET Framework 2.0 Servic
    ·如何動(dòng)態(tài)修改winform的app
    ·asp,net軟件結(jié)構(gòu)設(shè)計(jì)和相關(guān)
    ·學(xué)習(xí)怎樣使用ASP.NET中的虛
    ·,net基礎(chǔ)類的學(xué)習(xí):system
    ·.net學(xué)習(xí):c#事件的深入分
    ·Facade Pattern學(xué)習(xí)總結(jié)
    ·C#如何設(shè)置或者獲取目錄的
    ·如何使用XSL來(lái)定義ASP.NET
    ·理解WCF Data Contract契約
    ·如何能在.net2.0開(kāi)發(fā)的控件
    ·模式怎樣使用,講解模式的
    ·如何解決Menu菜單被frame遮
    關(guān)于我們 | 軟件開(kāi)發(fā) | 下載試用 | 客服中心 | 聯(lián)系我們 | 友情鏈接 | 網(wǎng)站地圖 | 新疆電子地圖 | RSS訂閱
    版權(quán)所有 © 2016 新疆二域軟件開(kāi)發(fā)網(wǎng) m.jdtbank.com All Rights Reserved 新ICP備14003571號(hào)
    新疆軟件開(kāi)發(fā)總機(jī):0991-4842803、4811639.
    客服QQ:596589785 ;地址:新疆烏魯木齊北京中路華聯(lián)大廈A-5C 郵編:830000
     
    包头市| 无为县| 三原县| 通州市| 根河市| 当雄县| 丹寨县| 昌邑市| 长宁区| 高清| 长葛市| 芷江| 阿图什市| 松滋市| 富顺县| 绿春县| 吉林省| 余姚市| 华蓥市| 鹰潭市| 马公市| 德令哈市| 镇巴县| 罗平县| 广饶县| 新昌县| 长宁区| 扶沟县| 绥棱县| 靖远县| 莱州市| 麻城市| 大新县| 文化| 琼结县| 漳浦县| 泗阳县| 绥宁县| 抚松县| 台中市| 新平|