博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

C# 多线程 异步加载 窗体

Posted on 2015-07-30 11:31  sky410  阅读(3867)  评论(1编辑  收藏  举报

C# 多线程 异步加载 窗体

分类: C#

我们在使用 windowform 编程的时候,我们或许可能会越到,各种在窗体加载的时候,会进行其他的操作:
 
1.若是在加载之前,操作---》整个界面出来的很慢,而且若是时间长的话,页面很久才能出来,
2.若是写在加载之后处理的话,虽然界面出来了,这个时候,出现了假死的状体。但是不能乱点,一点,就有卡死的现象。
现在我们利用异步,和多线程来控制,并且加上进度条。来做一个界面加载的时候出现很大操作。
示例:
 
[csharp] view plaincopyprint?
 
  1. using System.Windows.Forms;  
  2. using System.Threading;  
  3. using System;  
  4.   
  5. namespace Threaddemo1  
  6. {  
  7.     public partial class Form1 : Form  
  8.     {  
  9.         public Form1()  
  10.         {  
  11.             InitializeComponent();  
  12.         }  
  13.         delegate void aa(string s);//创建一个代理  
  14.   
  15.         private void Form1_Load(object sender, EventArgs e)  
  16.         {  
  17.             Thread newthread = new Thread(new ThreadStart(ttread));  
  18.             newthread.Start();  
  19.         }  
  20.         void ttread()  
  21.         {  
  22.             pri("77");  
  23.         }  
  24.         private delegate void ProgressBarShow(int i);  
  25.         private void pri(string p)  
  26.         {  
  27.             bool name = richTextBox1.InvokeRequired;  
  28.             //MessageBox.Show(name.ToString());  
  29.             if (!richTextBox1.InvokeRequired)//判断是否需要进行唤醒的请求,如果控件与主线程在一个线程内,可以写成if(!InvokeRequired)  
  30.             {  
  31.                 Loadthread();  
  32.             }  
  33.             else  
  34.             {  
  35.              //   MessageBox.Show("不是同一个线程");  
  36.                 aa a1 = new aa(pri);  
  37.                 Invoke(a1, new object[] { p });//执行唤醒操作  
  38.             }  
  39.         }  
  40.   
  41.         private void Loadthread()  
  42.         {  
  43.             string s = string.Empty;  
  44.             for (int b = 0; b < 10000; b++)  
  45.             {  
  46.                 this.ShowPro(b);  
  47.                 s += b.ToString();  
  48.             }  
  49.             //MessageBox.Show("同一线程内");  
  50.             LoadRichebox(s);  
  51.         }  
  52.         void send() {  
  53.             Thread.CurrentThread.Abort();  
  54.         }  
  55.         private void LoadRichebox(string s)  
  56.         {  
  57.             richTextBox1.Text = s;  
  58.         }  
  59.         private void ShowPro(int value)  
  60.         {  
  61.             if (this.InvokeRequired)  
  62.             {  
  63.                 this.Invoke(new ProgressBarShow(ShowPro), value);  
  64.             }  
  65.             else  
  66.             {  
  67.                 this.progressBar1.Value = value;  
  68.                 this.label1.Text = value + "% Processing...";  
  69.             }  
  70.         }  
  71.     }  
  72. }