1、当有大量数据需要计算、显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- using System.IO;
- using System.Diagnostics;
- using System.Runtime.InteropServices;
- using System.Threading;
- namespace WindowsFormTest{
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- Control.CheckForIllegalCrossThreadCalls = false;
- }
- Thread drawThread = null;
- delegate void drawDelegate(int i);
- //开启子线程
- private void btnTest_Click(object sender, EventArgs e)
- {
- closeThread();
- drawThread = new Thread(new ThreadStart(draw));
- drawThread.IsBackground = true;
- drawThread.Start();
- }
- //draw子线程,循环调用test函数,并且等待一会
- private void draw()
- {
- try
- {
- for (int i = 0; i < 100000000; i++)
- {
- test(i);
- Thread.Sleep(100);
- }
- }
- catch (System.Exception e1)
- {
- return;
- }
- closeThread();
- }
- //test函数,向textBox中添加数据
- private void test(int i)
- {
- if (textBox1.InvokeRequired)
- {
- drawDelegate d = new drawDelegate(test);
- Invoke(d, new object[] {i });
- }
- else
- {
- textBox1.AppendText(i.ToString()+"\r\n");
- }
- }
- //结束子线程
- private void closeThread()
- {
- if (drawThread != null)
- {
- if (drawThread.IsAlive)
- {
- drawThread.Abort();
- }
- }
- }
- //窗体关闭时,关闭子线程
- private void Form1_FormClosing(object sender, FormClosingEventArgs e)
- {
- closeThread();
- }
- }
- }