zoukankan      html  css  js  c++  java
  • WinForm多线程+委托防止界面卡死

    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()+"
    ");
                }
            }      
    
            //结束子线程
            private void closeThread()
            {
                if (drawThread != null)
                {
                    if (drawThread.IsAlive)
                    {
                        drawThread.Abort();
                    }
                }
            }
            
            //窗体关闭时,关闭子线程
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                closeThread();
            }
        }
    }
  • 相关阅读:
    GitHub注册和Git安装
    Git克隆与更新代码
    三,jenkins配置构建执行状态
    四,jenkins设置定时任务
    二,jenkins创建构建任务
    一,jenkins环境搭建
    Python Selenium Web自动化上传/下载文件图文详解
    Robot Framework自动化测试(七)--- jybot模式
    jmeter eval函数之妙用(参数化文件内含各种表达式)
    jmeter ssh+jdbc用法
  • 原文地址:https://www.cnblogs.com/bdzwater/p/3731904.html
Copyright © 2011-2022 走看看