C# 多線程 異步加載 窗體


C# 多線程 異步加載 窗體

分類: C#

我們在使用 windowform 編程的時候,我們或許可能會越到,各種在窗體加載的時候,會進行其他的操作:
 
1.若是在加載之前,操作---》整個界面出來的很慢,而且若是時間長的話,頁面很久才能出來,
2.若是寫在加載之后處理的話,雖然界面出來了,這個時候,出現了假死的狀體。但是不能亂點,一點,就有卡死的現象。
現在我們利用異步,和多線程來控制,並且加上進度條。來做一個界面加載的時候出現很大操作。
示例:
 
[csharp]  view plain copy print ?
 
  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. }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM