Winform 多线程中处理UI控件, 解决线程安全引起的异常

Winform 多线程中处理UI控件, 多线程中不能直接操作UI控件, 会引发线程安全异常

using System;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp10
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /*
            在窗体拖拽2个button,1个label
         */ 
        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(Test1);
            thread.Start();
        }

        // 线程中直接操作控件会引发线程安全异常
        // Cross-thread operation not valid: Control 'label1' accessed from a thread other than the thread it was created on.'
        private void Test1()
        {
            for (int i = 0; i < 1000; ++i)
            {
                label1.Text = i.ToString();
            }
        }

        // Control.CheckForIllegalCrossThreadCalls = false;// 可以解决掉所有控件安全异常
        private void Test2()
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            for (int i = 0; i < 1000; ++i)
            {
                label1.Text = i.ToString();
            }
        }

        // 在线程中用委托操作UI控件
        delegate void InvokeHandler();
        private void Test3()
        {
            for (int i = 0; i < 1000; ++i)
            {
                // net 2.0
                this.Invoke(new InvokeHandler(delegate ()
                {
                    label1.Text = i.ToString();
                }));
            }
        }

        // 在线程中用委托操作UI控件
        private void Test4()
        {
            for (int i = 0; i < 1000; ++i)
            {
                // net 3.5 以上
                this.Invoke((Action)(() =>
                {
                    label1.Text = i.ToString();
                }));
            }
        }
    }
}



作者最新文章
Winform TextBox (文本框) 密码输入框, 输入内容显示*号 (星号)
Winform 启动前弹出登录界面, 登录成功之后再显示主界面
C# 字符串string和字符数组char[]的相互转换
C# 字符串倒序输出, 实现字符串倒序的方法
Winform 如何从 TextBox(文本框) 控件读取每一行数据到数组