備注學院

          LuLu

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            5 隨筆 :: 50 文章 :: 16 評論 :: 0 Trackbacks
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(4)

          隨筆檔案

          文章分類

          文章檔案

          資源網站

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          方法一:

          一般來說,直接在子線程中對窗體上的控件操作是會出現異常,這是由于子線程和運行窗體的線程是不同的空間,因此想要在子線程來操作窗體上的控件,是 不可能 簡單的通過控件對象名來操作,但不是說不能進行操作,微軟提供了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 閱讀(457) 評論(0)  編輯  收藏 所屬分類: C#
          主站蜘蛛池模板: 临邑县| 民乐县| 济宁市| 安阳县| 莱州市| 乌拉特前旗| 栾城县| 新乡市| 循化| 五莲县| 沙湾县| 奉化市| 宁蒗| 葫芦岛市| 民勤县| 崇信县| 唐海县| 兴城市| 金寨县| 辽阳市| 西丰县| 盖州市| 翁牛特旗| 集贤县| 江阴市| 丹东市| 古浪县| 永平县| 晴隆县| 天门市| 永年县| 思茅市| 宿迁市| 金昌市| 南雄市| 成安县| 兴安县| 东港市| 广昌县| 嵩明县| 阿拉善右旗|