• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            cc

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              38 隨筆 :: 14 文章 :: 21 評論 :: 0 Trackbacks

            BeginInvoke 方法真的是新開一個線程進行異步調(diào)用嗎?
            參考以下代碼:

            public delegate void treeinvoke();

            private void UpdateTreeView()

            {

            ??? MessageBox.Show(System.Threading.Thread.CurrentThread.Name);

            }

            private void button1_Click(object sender, System.EventArgs e)

            {

            ??? System.Threading.Thread.CurrentThread.Name = "UIThread";

            ??? treeView1.BeginInvoke(new treeinvoke(UpdateTreeView));

            }

            看看運行結(jié)果,彈出的對話框中顯示的是 UIThread ,這說明 BeginInvoke 所調(diào)用的委托根本就是在 UI 線程中執(zhí)行的。

            既然是在 UI 線程中執(zhí)行,又何來 異步執(zhí)行 一說呢?

            我們再看看下面的代碼:

            public delegate void treeinvoke();

            private void UpdateTreeView()

            {

            ??? MessageBox.Show(Thread.CurrentThread.Name);

            }

            private void button1_Click(object sender, System.EventArgs e)

            {

            ??? Thread.CurrentThread.Name = "UIThread";

            ??? Thread th = new Thread(new ThreadStart(StartThread));

            ??? th.Start();

            }

            private void StartThread()

            {

            ??? Thread.CurrentThread.Name = "Work Thread";

            ??? treeView1.BeginInvoke(new treeinvoke(UpdateTreeView));

            }

            再看看運行結(jié)果,彈出的對話框中顯示的還是 UIThread ,這說明什么?這說明 BeginInvoke 方法所調(diào)用的委托無論如何都是在 UI 線程中執(zhí)行的。

            BeginInvoke 究竟有什么用呢?

            在多線程編程中,我們經(jīng)常要在工作線程中去更新界面顯示,而在多線程中直接調(diào)用界面控件的方法是錯誤的做法,具體的原因可以在看完我的這篇之后看看這篇: 在多線程中如何調(diào)用 Winform ,如果你是大牛的話就不要看我這篇了,直接看那篇吧,反正那篇文章我沒怎么看懂。

            Invoke BeginInvoke 就是為了解決這個問題而出現(xiàn)的,使你在多線程中安全的更新界面顯示。

            正確的做法是將工作線程中涉及更新界面的代碼封裝為一個方法,通過 Invoke 或者 BeginInvoke 去調(diào)用,兩者的區(qū)別就是一個導(dǎo)致工作線程等待,而另外一個則不會。

            而所謂的 一面響應(yīng)操作,一面添加節(jié)點 永遠(yuǎn)只能是相對的,使 UI 線程的負(fù)擔(dān)不至于太大而以,因為界面的正確更新始終要通過 UI 線程去做,我們要做的事情是在工作線程中包攬大部分的運算,而將對純粹的界面更新放到 UI 線程中去做,這樣也就達(dá)到了減輕 UI 線程負(fù)擔(dān)的目的了。

            而在那段更新樹節(jié)點的代碼中,其實唯一起作用的代碼是: System.Threading.Thread.Sleep(100); ,它使 UI 線程有了處理界面消息的機會,其實 數(shù)碼幽靈 將問題復(fù)雜化了,只要以下的代碼就可以很好的工作了。

            private void button1_Click_(object sender, System.EventArgs e)

            {

            ??? TreeNode tn;

            ??? for(int i=0;i<100000;i++)

            ??? {

            ??????? tn=new TreeNode (i.ToString());

            ??????? this.treeView1.Nodes[0].Nodes.Add(tn);

            ??????? if (i%100 == 0) Application.DoEvents();

            ??? }

            }

            posted on 2006-12-07 14:52 醒目西西 閱讀(233) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久亚洲日韩精品一区二区三区| 久久无码国产| 精品无码久久久久国产| 久久伊人精品青青草原高清| 久久久久久A亚洲欧洲AV冫| 久久婷婷五月综合成人D啪| 青草国产精品久久久久久| 中文字幕一区二区三区久久网站| 少妇久久久久久被弄到高潮| 久久久国产精品亚洲一区| 国产女人aaa级久久久级| 亚洲国产美女精品久久久久∴| 国产精品久久久久久影院| 欧美久久久久久| 国产无套内射久久久国产| 伊人久久综合成人网| 久久国产一片免费观看| 97精品伊人久久大香线蕉| 国产日韩久久免费影院| 精品熟女少妇av免费久久| 亚洲日韩欧美一区久久久久我 | 久久天天躁狠狠躁夜夜不卡| 亚洲中文字幕无码久久综合网| 丁香五月综合久久激情| 国产欧美久久久精品| 久久久久久久久久久久中文字幕 | 99久久夜色精品国产网站| 久久国产精品二国产精品| 久久综合久久综合久久| 久久精品国产亚洲沈樵| 国产69精品久久久久777| 亚洲精品国精品久久99热一| 久久精品国产清自在天天线| 久久久噜噜噜久久中文字幕色伊伊 | 国产亚州精品女人久久久久久| av无码久久久久不卡免费网站| 亚洲综合伊人久久大杳蕉| 亚洲国产精品无码久久久不卡| 亚洲AV日韩精品久久久久久久 | 一级做a爰片久久毛片16| 国产成人无码精品久久久免费|