C#使用BackgroundWorker出现线程间操作无效的问题

eastyes 2011-05-16 03:07:52
想要达到的目的:
一个窗体(mainform)上有一个datagridview1,要把其中的数据导出到excel中,加一个按钮(But1),一点按弹即开始导出操作,并弹出一个窗体(frm)提示正在导出,显示一个进度条。
使用的方法:
加一个BackgroundWorker:work1
写一个执行导出操作的方法:daochubaozhangdan(),在这个方法中使用了mainform中的控件datagridview1

按钮But1的响应:
private void But1_Click(object sender, EventArgs e)
{
work1.WorkerReportsProgress = true;
work1.DoWork += new System.ComponentModel.DoWorkEventHandler(work1_DoWork);
work1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(work1_ProgressChanged);
work1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(work1_RunWorkerCompleted);
work1.RunWorkerAsync();
frm.ShowDialog();
}


private void work1_DoWork(object sender, DoWorkEventArgs e)
{
daochubaozhangdan();
}

private void work1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
frm.ProgressValue = e.ProgressPercentage;
}

private void work1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
frm.Close();
MessageBox.Show("导出完成", "提示");
}

出现的问题:执行到daochubaozhangdan()需要读取datagridview1的内容时出现:线程间操作无效: 从不是创建控件“datagridview1”的线程访问它。
请问应该如何解决这个问题?
另外如果在mainform的InitializeComponent()后加上CheckForIllegalCrossThreadCalls = false则进入死循环但不进入daochubaozhangdan()方法,何解?
...全文
453 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuvillagearcher 2012-10-17
  • 打赏
  • 举报
回复
2楼神人也!
eastyes 2011-05-16
  • 打赏
  • 举报
回复
我又试了一下确实是有效的,我开始的时候加了个saveFileDialog1于是就进不到处理方法中来了。。。
[Quote=引用 2 楼 lbreathy 的回复:]
可以加个属性,在Load事件中,是:

C# code

Control.CheckForIllegalCrossThreadCalls = false;


我是做WINFORM的,不知道web这样可以不可以,你可以试下
[/Quote]
xuexiaodong2009 2011-05-16
  • 打赏
  • 举报
回复
不能直接操作主线程的组件,使用invoke判断是否跨线程,使用代理调用方法
LBreathy 2011-05-16
  • 打赏
  • 举报
回复
可以加个属性,在Load事件中,是:

Control.CheckForIllegalCrossThreadCalls = false;

我是做WINFORM的,不知道web这样可以不可以,你可以试下
bdmh 2011-05-16
  • 打赏
  • 举报
回复
不能直接操作主线程的组件,使用invoke

110,545

社区成员

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

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

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