线程通过事件更新主屏幕
本文关键字:屏幕 更新 事件 线程 | 更新日期: 2023-09-27 17:50:20
我正试图获得一个线程来更新GUI,我被建议使用事件。
具体来说,应用程序在下面的UpdateResult()方法中给了我一个交叉线程错误。我假设我引发的事件是从线程中引发的,因此这个问题是因为它试图更新主线程上运行的GUI。
我做错了什么?
谢谢Damo
c#代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
public delegate void UpdateScreenEventHandler();
namespace EventHandler
{
public partial class Form1 : Form
{
public static event UpdateScreenEventHandler _UpdateScreen;
public Form1()
{
InitializeComponent();
}
public void Form1_Load(object sender, EventArgs e)
{
// Add event handlers to Show event.
_UpdateScreen += new UpdateScreenEventHandler(UpdateResult);
}
private void button1_Click(object sender, EventArgs e)
{
// Thread the status check
Thread trd = new Thread(() => Threadmethod());
trd.IsBackground = true;
trd.Start();
}
private void Threadmethod()
{
// Invoke the event.
_UpdateScreen.Invoke();
}
private void UpdateResult()
{
textBox1.Text = "This Is the result";
MessageBox.Show(textBox1.Text);
}
}
}
事件是从后台线程触发的,所以如果你想从事件处理程序中访问UI元素,你需要封送到UI线程。
private void UpdateResult()
{
textBox1.Invoke(new Action( ()=>
{
textBox1.Text = "This Is the result";
MessageBox.Show(textBox1.Text);
});
}
另一个选择是在UI线程中触发事件,这样事件处理程序就不需要做这件事了。
private void Threadmethod()
{
Invoke(new Action(() =>
{
// Invoke the event.
_UpdateScreen.Invoke();
});
}
将文本框设置在同一线程上。从你的事件中调用。
private void SetText(string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}
这是根据以下MSDN链接:
http://msdn.microsoft.com/en-us/library/ms171728%28v=vs.80%29.aspx