備注學(xué)院

          LuLu

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            5 隨筆 :: 50 文章 :: 16 評(píng)論 :: 0 Trackbacks

          方法一:

          一般來(lái)說(shuō),直接在子線程中對(duì)窗體上的控件操作是會(huì)出現(xiàn)異常,這是由于子線程和運(yùn)行窗體的線程是不同的空間,因此想要在子線程來(lái)操作窗體上的控件,是 不可能 簡(jiǎn)單的通過(guò)控件對(duì)象名來(lái)操作,但不是說(shuō)不能進(jìn)行操作,微軟提供了Invoke的方法,其作用就是讓子線程告訴窗體線程來(lái)完成相應(yīng)的控件操作。

          現(xiàn)在用一個(gè)用線程控制的進(jìn)程條來(lái)說(shuō)明,大致的步驟如下:

          1.創(chuàng)建Invoke函數(shù),大致如下:  
          /// <summary>  
          /// Delegate function be invoked by main thread  
          /// </summary>  
          private      void      InvokeFun()  
          {  
               if(prgBar.Value< 100)  
               prgBar.Value = prgBar.Value + 1;  
          }  

          2.子線程入口函數(shù):  
          /// <summary>  
          /// Thread function interface  
          /// </summary>  
          private void ThreadFun()  
          {  
               // Create invoke method by specific function
               MethodInvoker mi = new MethodInvoker(this.InvokeFun);  

               for(int i=0; i<100; i++)  
               {  
                 this.BeginInvoke(mi);    
                 Thread.Sleep(100);  
               }  
          }

          3.創(chuàng)建子線程:  
          Thread thdProcess = new Thread(new ThreadStart(ThreadFun));  
          thdProcess.Start();  

          方法二:
          加入該句:Control.CheckForIllegalCrossThreadCalls = False     取消線線程安全保護(hù)模式!

          方法三:帶參數(shù)
          使用類、類的方法或類的屬性都可以向線程傳遞參數(shù):
          public class UrlDownloader
          {
               string url;
            
               public UrlDownloader (string url)
               {
                 this.url = url;
               }
            
               public void Download()
               {
                 WebClient wc = new WebClient();
                 Console.WriteLine("Downloading " + url);                        
                 byte[] buffer = wc.DownloadData (url);
                 string download = Encoding.ASCII.GetString(buffer);
                 Console.WriteLine(download);
                 Console.WriteLine("Download successful.");
              
                 //這里你可以將download進(jìn)行保存等處理......
               }
          }

          [... 在另一個(gè)類中使用它們...]
                        
          UrlDownloader downloader = new UrlDownloader (yourUrl);
          new Thread (new ThreadStart (downloader.Download)).Start();

          注意參數(shù)是如何傳遞的。

          方法四:帶參數(shù)
          ThreadStart starter = delegate { Download(yourUrl); };
          new Thread(starter).Start();

          //使用線程池
          WaitCallback callback = delegate (object state) { Download ((string)state); };
          ThreadPool.QueueUserWorkItem (callback, yourUrl);

          方法五:帶參數(shù)
          Thread t = new Thread (new ParameterizedThreadStart(DownloadUrl));
          t.Start (myUrl);
          static void DownloadUrl(object url)
          {
            // ....
          }

          posted on 2008-10-31 10:17 smildlzj 閱讀(461) 評(píng)論(0)  編輯  收藏 所屬分類: C#
          主站蜘蛛池模板: 溧水县| 习水县| 精河县| 白山市| 赤峰市| 九寨沟县| 廉江市| 健康| 锦州市| 沅陵县| 荆州市| 师宗县| 廉江市| 左云县| 庄河市| 白山市| 苏尼特左旗| 济源市| 蕉岭县| 阳信县| 利辛县| 盐山县| 凤山市| 石渠县| 瑞昌市| 唐海县| 西宁市| 上饶市| 承德市| 益阳市| 五寨县| 奎屯市| 临颍县| 留坝县| 大宁县| 大新县| 建水县| 青河县| 乡宁县| 深州市| 大丰市|