Winform跨线程访问报错问题解决

`
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Winform跨线程访问报错问题解决
{
public partial class Form1 : Form
{
private ThreadMethodHelper threadMethodHelper;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        //解决方法1:取消跨线程调用(由于早期winform设计是线程不安全的,现在是线程安全的,用该方法会使winform变为线程不安全的,所以不推荐)
        //CheckForIllegalCrossThreadCalls = false;

        threadMethodHelper = new ThreadMethodHelper(this);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Thread thread = new Thread(new ThreadStart(Test));
        thread.Start();
    }

    /// <summary>
    /// 在线程中直接给Form的UI控件赋值报异常:
    /// System.InvalidOperationException:“线程间操作无效: 从不是创建控件“textBox1”的线程访问它。”
    /// </summary>
    //public void Test()
    //{
    //    textBox1.Text = "test1";
    //}

    //解决方法2:
    //public void Test()
    //{
    //    this.Invoke(new Action(() =>
    //    {
    //        textBox1.Text = "test1";
    //    }));

    //    this.Invoke(new EventHandler(delegate
    //    {
    //        textBox1.Text = "test1";
    //    }));
    //}


    //解决方法3:封装一个帮助类
    public void Test()
    {
        threadMethodHelper.SetText("test2", textBox1);
        Thread.Sleep(1000);
        threadMethodHelper.SetText(threadMethodHelper.GetText(textBox1), textBox2);
    }




}

}
`

posted @ 2024-11-21 22:38  小卡拉咪  阅读(4)  评论(0编辑  收藏  举报