WinForm多线程+委托防止界面卡死

来源:互联网 发布:淘宝拒收怎么申请退款 编辑:程序博客网 时间:2024/05/18 19:40

转自:http://www.cnblogs.com/bmbh/p/3795774.html

1、当有大量数据需要计算、显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决

[html] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Text;  
  7. using System.Windows.Forms;  
  8. using System.IO;  
  9. using System.Diagnostics;  
  10. using System.Runtime.InteropServices;  
  11. using System.Threading;  
  12.   
  13.   
  14. namespace WindowsFormTest{  
  15.     public partial class Form1 : Form  
  16.     {  
  17.         public Form1()  
  18.         {  
  19.             InitializeComponent();  
  20.             Control.CheckForIllegalCrossThreadCalls = false;  
  21.         }  
  22.   
  23.         Thread drawThread = null;              
  24.         delegate void drawDelegate(int i);  
  25.   
  26.         //开启子线程  
  27.         private void btnTest_Click(object sender, EventArgs e)  
  28.         {  
  29.             closeThread();  
  30.   
  31.             drawThread = new Thread(new ThreadStart(draw));  
  32.             drawThread.IsBackground = true;  
  33.             drawThread.Start();  
  34.         }  
  35.   
  36.         //draw子线程,循环调用test函数,并且等待一会  
  37.         private void draw()  
  38.         {  
  39.             try  
  40.             {  
  41.                 for (int i = 0; i < 100000000; i++)  
  42.                 {  
  43.                     test(i);  
  44.                     Thread.Sleep(100);  
  45.                 }  
  46.             }  
  47.             catch (System.Exception e1)  
  48.             {  
  49.                 return;  
  50.             }  
  51.   
  52.             closeThread();  
  53.         }  
  54.   
  55.         //test函数,向textBox中添加数据  
  56.         private void test(int i)  
  57.         {  
  58.             if (textBox1.InvokeRequired)  
  59.             {  
  60.                 drawDelegate d = new drawDelegate(test);  
  61.                 Invoke(d, new object[] {i });  
  62.             }   
  63.             else  
  64.             {  
  65.                 textBox1.AppendText(i.ToString()+"\r\n");  
  66.             }  
  67.         }        
  68.   
  69.         //结束子线程  
  70.         private void closeThread()  
  71.         {  
  72.             if (drawThread != null)  
  73.             {  
  74.                 if (drawThread.IsAlive)  
  75.                 {  
  76.                     drawThread.Abort();  
  77.                 }  
  78.             }  
  79.         }  
  80.           
  81.         //窗体关闭时,关闭子线程  
  82.         private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
  83.         {  
  84.             closeThread();  
  85.         }  
  86.     }  
  87. }