木子屋 Dnawo's BLOG

使用Invoke解决多线程间的控件访问出错

👤 dnawo 📅 2009-02-20 👁 5242 👍 0 💬 0 🔄 本站原创
在一个WinForm界面上有一个按钮(button1)和一个文本框(textBox1),在button1的点击事件处理程序中创建一个新的线程,并期望在新线程中更改textBox1的值,代码如下:

/// <summary>
/// 按钮点击事件处理程序
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
    //创建新线程
    Thread processorThread = null;
    processorThread = new Thread(new ThreadStart(Done));
    processorThread.IsBackground = true;
    processorThread.SetApartmentState(ApartmentState.STA);
    processorThread.Start();
}

/// <summary>
/// 更新textBox1值
/// </summary>
private void Done()
{
    textBox1.Text = "www.mzwu.com";
}

运行程序点击按钮后出错,提示:线程间操作无效: 从不是创建控件“textBox1”的线程访问它。下边我们用Invoke解决这一问题:

/// <summary>
/// 按钮点击事件处理程序
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
    //创建新线程
    Thread processorThread = null;
    processorThread = new Thread(new ThreadStart(Done));
    processorThread.IsBackground = true;
    processorThread.SetApartmentState(ApartmentState.STA);
    processorThread.Start();
}

delegate void WriteInvoke(string msg);
private void Write(string msg)
{
    textBox1.Text = msg;
}
/// <summary>
/// 更新textBox1值
/// </summary>
private void Done()
{
    this.Invoke(new WriteInvoke(Write), new object[] { "www.mzwu.com" });
}

更新成功!

评论(0)

暂无评论。

计算题
评论需审核通过后显示
← 上一篇 使用VS2008对类成员进行单元测试 下一篇 → C#生成Jad文件源代码