积极答复者
自己创建的一个类,有个backgroundworker变量。为什么多线程中可以调用控件。。

问题
-
public partial class Component1 : SerialPort
{
private System.ComponentModel.BackgroundWorker backgroundWorker1;
private System.Windows.Forms.TextBox textBox1;
//多余的就不写了。。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
textBox1.Text = "_PoolUntil";
}
}
}
为什么他能这样做,其实这样是错误的。他却可以正常运行。
发现他不能调用Invoke这个函数,如果调用就会出现
"在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。"- 已移动 Sheng Jiang 蒋晟Moderator 2009年5月14日 16:01 Windows表单类库问题 ([Loc]From:Visual C#)
答案
-
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
这个例子很全,看看吧
知识改变命运,奋斗成就人生!- 已标记为答案 Riquel_DongModerator 2009年5月18日 2:59
全部回复
-
你好,
1.如果在执行 RunWorkerAsync() 之前没有把 textBox 加入到 From.Controls 中那是正确的,如果RunWorkerAsync() 之前已执行了 Form.Controls.Add(textBox1) 那上面的代码是错的2. 不能调用 Invoke 是因为 textBox1 是在UI线程中创建的, 如果你把 textBox1 创建的代码写到 DoWork 中那执行就没有问题了, Invoke 必须在创建控件的线程上使用
知识改变命运,奋斗成就人生!
textbox1不是在form建立的,是不是没办法controls.add呢。?? -
你是想在什么时候 Add textbox1
知识改变命运,奋斗成就人生!
public partial class Component1 : SerialPort
{
private System.ComponentModel.BackgroundWorker backgroundWorker1;
private System.Windows.Forms.TextBox textBox1;
//多余的就不写了。。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
textBox1.Text = "_PoolUntil";
}
}
}
在这个类中,应该没办法add吧。是否能够用此类的本身的invoke功能?? -
这里地说明可能会有一些帮助:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invokerequired.aspx
我猜InvokeRequired应该使用线程本地存储实现的。 -
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
这个例子很全,看看吧
知识改变命运,奋斗成就人生!- 已标记为答案 Riquel_DongModerator 2009年5月18日 2:59
-
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
这个例子很全,看看吧
知识改变命运,奋斗成就人生!
谢谢,真的很头疼的说。。 -
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
这个例子很全,看看吧
知识改变命运,奋斗成就人生!
应该算是找到比较完整的问题所在
invoke不能放在lock里面
lock(this)
{
invoke这句运行时是对的,退出时就会有麻烦。。。感觉是这样,,不太清楚
}