积极答复者
(有代码)事件和委托跨线程调用Windows控件显示的问题

问题
-
我有个疑问,谢大侠指教:为什么事件跨线程调用Windows控件会出异常?(委托不会) 以下是事例代码:
a) 1个form,1个label控件,1个button控件,控件名称全部为默认名称
b) Visual Studio 2008 - C#
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;namespace ThreadException
{
public partial class Form1 : Form
{
//delegate void SetTextCallback(string text);public Form1()
{
InitializeComponent();
}private void button1_Click(object sender, EventArgs e)
{
this.button1.Enabled = false;MyThreadClass myClass1 = new MyThreadClass(0, 100);
myClass1.ThreadEvent += new MyThreadClass.ThreadEventHandler(myClass1_ThreadEvent);
Thread myThread1 = new Thread(myClass1.ThreadRun);
myThread1.IsBackground = true;
myThread1.Start();
}private void SetText(string text)
{
this.label1.Text = text;
}private void myClass1_ThreadEvent(object sender, ThreadInfoEventArgs e)
{
this.label1.Text = e.Number.ToString(); //此处会抛跨线程调用控件异常,用delegate方式正常,是不是Invoke方法有什么特别的地方???//string text = e.Number.ToString();
//if (this.label1.InvokeRequired)
//{
// SetTextCallback d = new SetTextCallback(SetText);
// this.Invoke(d, new object[] { text });
//}
//else
//{
// this.label1.Text = text;
//}
}
}
public class ThreadInfoEventArgs : EventArgs
{
private int _number = 0;
public int Number
{
get { return this._number; }
set { this._number = value; }
}private bool _updateButton = false;
public bool UpdateButton
{
get { return this._updateButton; }
set { this._updateButton = value; }
}
}public class MyThreadClass
{
public delegate void ThreadEventHandler(object sender,ThreadInfoEventArgs e);
public event ThreadEventHandler ThreadEvent;private int _start = 0;
public int Start
{
get { return this._start; }
}private int _end = 10000;
public int End
{
get { return this._end; }
}public MyThreadClass(int Start, int End)
{
this._start = Start;
this._end = End;
}public void ThreadRun()
{
for (int index = this._start; index <= this._end; index++)
{
ThreadInfoEventArgs fe = new ThreadInfoEventArgs();
fe.Number = index;
if (index == this._end)
fe.UpdateButton = true;Thread.Sleep(10);
ThreadEvent(this, fe);
}
}
}
}- 已编辑 漂过来的 2010年4月7日 19:04 说明环境版本
答案
-
你看你下面代码的结构,ThreadEvent 这个委托是运行在线程中的。
myClass1.ThreadEvent += new MyThreadClass.ThreadEventHandler(myClass1_ThreadEvent);
Thread myThread1 = new Thread(myClass1.ThreadRun);
myThread1.IsBackground = true;
myThread1.Start();public void ThreadRun()
{
for (int index = this._start; index <= this._end; index++)
{
ThreadInfoEventArgs fe = new ThreadInfoEventArgs();
fe.Number = index;
if (index == this._end)
fe.UpdateButton = true;Thread.Sleep(10);
ThreadEvent(this, fe);
}
}
知识改变命运,奋斗成就人生!- 已标记为答案 漂过来的 2010年4月8日 4:32
全部回复
-
-
你看你下面代码的结构,ThreadEvent 这个委托是运行在线程中的。
myClass1.ThreadEvent += new MyThreadClass.ThreadEventHandler(myClass1_ThreadEvent);
Thread myThread1 = new Thread(myClass1.ThreadRun);
myThread1.IsBackground = true;
myThread1.Start();public void ThreadRun()
{
for (int index = this._start; index <= this._end; index++)
{
ThreadInfoEventArgs fe = new ThreadInfoEventArgs();
fe.Number = index;
if (index == this._end)
fe.UpdateButton = true;Thread.Sleep(10);
ThreadEvent(this, fe);
}
}
知识改变命运,奋斗成就人生!- 已标记为答案 漂过来的 2010年4月8日 4:32