方法一:
在 VS2003 中, 也不能直接访问, 参看
一般来说, 直接在子线程中对窗体上的控件操作是会出现异常, 这是由于子线程和运行窗体的线程是不同的空间, 因此想要在子线程来操作窗体上的控件, 是不可能 简单的通过控件对象名来操作, 但不是说不能进行操作, 微软提供了 Invoke 的方法, 其作用就是让子线程告诉窗体线程来完成相应的控件操作.
现在用一个用线程控制的进程条来说明, 大致的步骤如下:
1.创建 Invoke 函数, 大致如下:
- ///
- /// Delegate function be invoked by main thread
- ///
- private void InvokeFun()
- {
- if(prgBar.Value< 100)
- prgBar.Value = prgBar.Value + 1;
- }
2.子线程入口函数:
- ///
- /// Thread function interface
- ///
- 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();
备注:
- using System.Threading;
- private System.Windows.Forms.ProgressBar prgBar;
方法二:
加入该句: 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();
来源: http://www.bubuko.com/infodetail-3352316.html