当使用多线程功能时,在子线程里修改UI控件参数时,如:
textBox1.Text += str;
会引发异常。
异常:已引发: "线程间操作无效: 从不是创建控件“textBox1”的线程访问它。" (System.InvalidOperationException)
引发了一个 System.InvalidOperationException: "线程间操作无效: 从不是创建控件“textBox1”的线程访问它。"
时间: 2019/2/19 16:22:58
线程: <无名称>[11580]
解决方法之一是,在构造函数处添加代码System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
禁止捕获对错误线程的调用。
public Form1()
{
InitializeComponent();
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
}
不过上面这个方法并不是微软推荐的,所以采用委托的方式如下:
this.Invoke(new EventHandler(delegate
{
textBox1.Text += str;
}));
因为该子线程不是UI的创建者,所以子线程应该使用一个委托让UI线程来执行textBox1.Text += str
操作。
其中EventHandler是一个事件委托,其定义如下:
using System.Runtime.InteropServices;
namespace System
{
// 摘要:
// 表示将处理不包含事件数据的事件的方法。
//
// 参数:
// sender:
// 事件源。
//
// e:
// 不包含任何事件数据的 System.EventArgs。
[Serializable]
[ComVisible(true)]
public delegate void EventHandler(object sender, EventArgs e);
}
如果对委托类型不了解,也可以直接按照Lamda表达式的写法,改写成如下形式。
this.Invoke(new Action(() =>
{
textBox1.Text += str;
}));