備注學院

          LuLu

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            5 隨筆 :: 50 文章 :: 16 評論 :: 0 Trackbacks

          方法一:

          一般來說,直接在子線程中對窗體上的控件操作是會出現異常,這是由于子線程和運行窗體的線程是不同的空間,因此想要在子線程來操作窗體上的控件,是 不可能 簡單的通過控件對象名來操作,但不是說不能進行操作,微軟提供了Invoke的方法,其作用就是讓子線程告訴窗體線程來完成相應的控件操作。

          現在用一個用線程控制的進程條來說明,大致的步驟如下:

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

          2.子線程入口函數:  
          /// <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.創建子線程:  
          Thread thdProcess = new Thread(new ThreadStart(ThreadFun));  
          thdProcess.Start();  

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

          方法三:帶參數
          使用類、類的方法或類的屬性都可以向線程傳遞參數:
          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進行保存等處理......
               }
          }

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

          注意參數是如何傳遞的。

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

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

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

          posted on 2008-10-31 10:17 smildlzj 閱讀(454) 評論(0)  編輯  收藏 所屬分類: C#
          主站蜘蛛池模板: 黄梅县| 兴化市| 江安县| 上栗县| 明光市| 桃江县| 九龙城区| 汉阴县| 伊宁市| 宜兰市| 楚雄市| 黄龙县| 阳谷县| 南城县| 红桥区| 万荣县| 澄江县| 田阳县| 龙泉市| 怀来县| 衡山县| 舞钢市| 如东县| 庄浪县| 沛县| 庆城县| 安徽省| 揭阳市| 临高县| 高雄县| 嘉善县| 旺苍县| 通辽市| 高阳县| 汉中市| 阳江市| 自治县| 内乡县| 长宁区| 常熟市| 焉耆|