1.概要
其他线程需要改变ui的属性。但是其他线程是不能操作ui的属性的。使用Invoke解决
Invoke的注释
//
// 摘要:
// 在拥有此控件的基础窗口句柄的线程上执行指定的委托。
//
// 参数:
// method:
// 包含要在控件的线程上下文中调用的方法的委托。
//
// 返回结果:
// 正在被调用的委托的返回值,或者如果委托没有返回值,则为 null。
public object Invoke(Delegate method);
2.代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Invoke实验
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Task task = new Task(() =>
{
button1.Text = "关闭";
});
task.Start();
}
private void button2_Click(object sender, EventArgs e)
{
Task task = new Task(() =>
{
button1.Invoke(new EventHandler(delegate
{
button1.Text = "关闭";
}));
});
task.Start();
}
}
}
3.运行

4.补记(问题发生)
System.InvalidOperationException:“线程间操作无效: 从不是创建控件“button1”的线程访问它。”

本文介绍了在.NET环境中,由于线程安全限制,其他线程无法直接修改UI元素属性的问题。通过使用Invoke方法,可以在非UI线程中安全地更新控件。文章提供了一个简单的代码示例,演示了如何在后台任务中改变按钮的文本,同时展示了当不正确使用时可能引发的`InvalidOperationException`。
3966

被折叠的 条评论
为什么被折叠?



