BackgroundWorker调用控件的方法?

liubococoa 2011-12-14 04:51:23
向Form中拖入一个BackgroundWorker(Name:backgroundWorker1),
backgroundWorker1_DoWork的内容是:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
label1.Text = "OK";
}

Form中button1的Click:
private void button1_Click(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}


点击按钮button1出现错误:“线程间操作无效: 从不是创建控件“label1”的线程访问它。”
我对线程不太懂,请指点一下BackgroundWorker调用控件的方法。
...全文
328 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
香儿爱土豆 2011-12-15
  • 打赏
  • 举报
回复
以上只是个大体思路~O(∩_∩)O~
香儿爱土豆 2011-12-15
  • 打赏
  • 举报
回复
private void button1_Click(object sender, EventArgs e)
{
string tip=string.empty;
BackGroundworker worker=new BackGroundworker();
worker.DoWork+=new DoWorkEventHandler((sender,e)=>
{
//ToDo this.tip="OK";
});

worker.ProgressChanged+= new ProgressChangedEventHandler((sender,e)=>
{
//ToDo->tip
});

worker.RunWorkerCompleted+=new RunWorkerCompletedEventHandler((sender,e)=>
{
//ToDo->tip
});
}
香儿爱土豆 2011-12-15
  • 打赏
  • 举报
回复
首先搞明白几个问题:

1.Winform下的控件不是线程安全的,WPF的控件可以做到线程安全

2.BackgroundWorker的三个事件:DoWork是跑在一个线程中的,ProgressChanged和RunWorkerCompleted事件是跑在主线程下的,所以实际上一个Worker开了两个线程
private void button1_Click(object sender, EventArgs e)
{


[align=center]

string tip=string.empty;
BackGroundworker worker=new BackGroundworker();

worker.DoWork+=new DoWorkEventHandler((sender,e)=>
{
//ToDo
this.tip="OK";
});

worker.ProgressChanged+= new ProgressChangedEventHandler((sender,e)=>
{
//ToDo->tip
});

worker.RunWorkerCompleted+=new RunWorkerCompletedEventHandler((sender,e)=>
{
//ToDo->tip
});
[/align]
}
全国话费充值 2011-12-15
  • 打赏
  • 举报
回复
BackgroundWorker _backgroundworker = new BackgroundWorker() { WorkerReportsProgress = true, WorkerSupportsCancellation = true };
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker backgroundworker = sender as BackgroundWorker;
backgroundworker.ReportProgress(0);
}

private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label1.Text = "OK";
}
fyydnr 2011-12-14
  • 打赏
  • 举报
回复
触发事件 ProgressChanged,之后 就会回到 主线程上 执行backgroundWorker1_ProgressChanged里的代码,
fyydnr 2011-12-14
  • 打赏
  • 举报
回复
当你调用 backgroundWorker1.RunWorkerAsync(); 方法之后,
控件将会新建一个线程 执行 backgroundWorker1_DoWork 的 代码,而label1 控件并不是在这个新建的线程中创建的 所以调试的时候报错。因该在backgroundWorker1_ProgressChanged的方法里 执行你需要更新 界面的代码。

liubococoa 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tjw687492 的回复:]
CheckForIllegalCrossThreadCalls = false;
[/Quote]
不是说BackgroundWorker可以解决“线程间控件操作”的问题吗?
我也是想解决Timer的方法中无法实现“线程间控件操作”,才试BackgroundWorker的。
tjw687492 2011-12-14
  • 打赏
  • 举报
回复
CheckForIllegalCrossThreadCalls = false;

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧