“从不是创建XX控件的线程访问它”错误的解决方法!

本文介绍如何在.NET Framework中安全地从不同线程调用控件的方法,包括使用Invoke和BeginInvoke方法来同步或异步执行控件上的方法。提供了具体的代码示例,演示了如何声明委托并在实际应用中调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在有些情况下,您可能需要通过线程调用控件的方法。例如,您可能要在窗体上调用一个禁用按钮或更新显示的方法来响应某个线程执行的操作。.NET Framework 提供从任何线程都可安全调用的方法,以调用与其他线程所拥有的控件进行交互的方法。Invoke 方法允许同步执行控件上的方法,而 BeginInvoke 方法则初始化异步执行。要使用这些方法,必须用与将调用的方法相同的签名声明委托。然后,您可以通过向要调用的方法提供适当的委托来调用窗体上任何控件的 Invoke 或 BeginInvoke 方法。任何必需的参数都包装在 Object 中,并被传输到该方法。

调用涉及其他线程所拥有的控件的方法
用与要调用的方法相同的签名声明一个委托。

下面的示例显示如何使用 Integer 和 String 参数声明委托。
调用涉及其他线程所拥有的控件的方法
用与要调用的方法相同的签名声明一个委托。

下面的示例显示如何使用 Integer 和 String 参数声明委托。

>Visual Basic

Public Delegate Sub myDelegate(ByVal anInteger as Integer, ByVal _
aString as String)





>C#
public delegate void myDelegate(int anInteger, string aString);


使用任何控件来调用对其他线程所拥有的控件进行操作的方法。

注意:
方法所需的参数(如果有)可在 Object 中提供。


如果要同步调用方法,请调用 Control.Invoke 方法。

>Visual Basic
Label1.Invoke(New myDelegate(AddressOf myMethod), New _
Object() {1, "This is the string"})





>C#
Label1.Invoke(new myDelegate(myMethod), new Object[] {1,
"This is the string"});


如果要异步调用方法,请调用 Control.BeginInvoke 方法。

>Visual Basic
Label1.BeginInvoke(New myDelegate(AddressOf myMethod), _
New Object() {1, "This is the string"})


>C#
Label1.BeginInvoke(new myDelegate(myMethod), new
Object[] {1, "This is the string"});


-----------------------------
举个例子:新建一个Windows应用程序项目Win1,在窗体Form1中添加一个Button名称为button1,然后转入代码页,按下面修改代码
using System;
using System.Windows.Forms;

namespace win1
{
public partial class Form1 : Form
{
public delegate void 我的委托();//声明一个委托
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)//此处先双击button1以便产生代码并且自动创建事件委托
{
new System.Threading.Thread(new System.Threading.ThreadStart (新线程)).Start();//创建一个新的线程并启动


}
public void 设置文字()
{
button1.Text = "Hello";
}

public void 新线程()
{
System.Threading.Thread.Sleep(2000);//线程休眠2秒
button1.BeginInvoke(new 我的委托(设置文字));//在button1所在线程上执行“设置文字”


}


}
}
运行:单击button1,两秒之后文字发生变化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值