<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      在UI線程執(zhí)行代碼(.Net)

      好久沒(méi)寫(xiě)博客了。最近在重構(gòu)代碼,碰到了很多了有意義的問(wèn)題,在此和大家分享。

      大家知道,在使用異步IO或者大量多線程代碼時(shí),總會(huì)碰到同步問(wèn)題,例如在其他線程調(diào)用Winform的Control相關(guān)代碼,就會(huì)導(dǎo)致異常。最近發(fā)現(xiàn)NAudio的WaveIn和WaveOut居然也需要使用UI線程的消息結(jié)構(gòu)才能正常工作,他們會(huì)在后臺(tái)創(chuàng)建不可見(jiàn)窗口。如果你在Socket的異步IO回調(diào)中直接調(diào)用Wave系列的方法,則會(huì)異常或者沒(méi)有任何反應(yīng)。(BeginXXX系列等異步方法的回調(diào)是在線程池中某個(gè)線程中調(diào)用的)

      一般Windows程序的UI線程只有一個(gè),UI相關(guān)的更新都應(yīng)該發(fā)生在UI線程上,才能保證安全。因此實(shí)際工作中,我們要學(xué)會(huì)怎么在一個(gè)非UI線程中轉(zhuǎn)向UI線程中執(zhí)行代碼(或者通知UI線程執(zhí)行某段代碼),下面我就說(shuō)兩種基本的方法:

      1. 使用WinForm的Control.Invoke

      WinForm的每個(gè)Control都有一個(gè)屬性(InvokeRequired)和一個(gè)方法(Invoke)用來(lái)在UI線程執(zhí)行代碼。Control.InvokeRequired屬性指示當(dāng)前線程是不是創(chuàng)建Control的線程。所以這種方法一般有以下的結(jié)構(gòu)

      1 ...
      2 
      3 if (anyControl.InvokeRequired)
      4 {
      5     anyControl.Invoke(new Action(delegate{ myControl.DoSomething(); }));
      6 }

      注意Invoke可以接受任何Delegate,但是那個(gè)Delegate必須是某一個(gè)Delegate:如果上面的代碼沒(méi)有new Action或者new MethodInvoker之類(lèi)的具體轉(zhuǎn)化,C#會(huì)因?yàn)椴恢烙媚膫€(gè)Delegate而報(bào)錯(cuò),因?yàn)楹芏郉elegate都符合這個(gè)沒(méi)參數(shù)沒(méi)返回值的signature。如果delegate有返回值,那么Invoke方法會(huì)返回那個(gè)值。Control還實(shí)現(xiàn)了BeginInvoke和EndInvoke執(zhí)行異步調(diào)用,但一般不會(huì)用到。

      這個(gè)方法有一個(gè)限制,就是你的上下文中有對(duì)UI控件的引用。很多情況下后臺(tái)代碼并沒(méi)有對(duì)UI控件的引用,就很不方便。

      2. 使用SynchronizationContext

      System.Threading.SynchronizationContext是.Net平臺(tái)下終極的線程間互相執(zhí)行代碼的機(jī)制。我在這里只是講講一下它在UI線程中的用法,其他的大家就看MSDN吧:)

      使用SynchronizationContext.Current可以獲得當(dāng)前線程的SynchronizationContext。并不是所有的線程都有SynchronizationContext,但是WinForm的UI線程肯定有一個(gè)(微軟保證的),所以在程序開(kāi)始的時(shí)候我們可以在Form的初始化代碼中獲得UI線程的Context,存在變量中,也可以傳給后臺(tái)代碼。之后我們想在UI線程執(zhí)行代碼(例如更新界面顯示),就可以調(diào)用下面兩個(gè)方法:

      1 // 同步執(zhí)行代碼,等待返回,第二個(gè)參數(shù)是方法參數(shù),沒(méi)有的話用null
      2 m_uiContext.Send(delegate {DoSomething();}, null);
      3 // 異步執(zhí)行代碼,立刻返回。第二個(gè)參數(shù)同上
      4 m_uiContext.Post(delegate {DoSomething();}, null);

      兩種方式一般沒(méi)有什么差別,因?yàn)槲覀儽M量保持UI線程的操作盡量很少,保證UI不會(huì)Freeze,因此都會(huì)很快執(zhí)行完畢。

      以上簡(jiǎn)單的介紹希望有用。如果誰(shuí)還知道其他的方法,歡迎提出,嘿嘿;)

      posted @ 2012-06-22 19:35  Leading  閱讀(3165)  評(píng)論(5)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产精品中文字幕在线| 亚洲av色在线播放一区| 国产av熟女一区二区三区| 女人高潮被爽到呻吟在线观看| 欧洲精品色在线观看| 精品无码老熟妇magnet | 8av国产精品爽爽ⅴa在线观看 | 性无码一区二区三区在线观看| 国产亚洲一区二区三不卡| 我国产码在线观看av哈哈哈网站| 久久精品欧美日韩精品| 好紧好爽好湿别拔出来视频男男| 欧美性色黄大片www喷水| 麻豆精品在线| 色av专区无码影音先锋| 国产精品亚洲中文字幕| 久久久久成人精品| 国产精品毛片在线看不卡| 精品国产一区二区三区av性色| 日本www一道久久久免费| 十八禁国产精品一区二区| 国产在线观看播放av| 久久国产精品免费一区| 狠狠人妻久久久久久综合蜜桃| 东京热一精品无码av| 无码日韩精品一区二区人妻| 亚洲欧美日韩综合一区二区| 日韩中文字幕人妻一区| 久久久久久性高| 日韩精品成人一区二区三| 国产网友愉拍精品视频手机 | 亚洲综合色一区二区三区| 久久香蕉国产线看观看亚洲片| 亚洲中文字幕无码av永久| 国产精品一二三区蜜臀av| 成av人电影在线观看| 国产精品天干天干综合网| 国产另类ts人妖一区二区| 老熟妇仑乱一区二区视頻| 狠狠躁夜夜躁人人爽天天69| 伊人久久大香线蕉AV网禁呦|