c#多线程如何才能访问到主线程内的变量?

zzddl 2008-03-07 09:56:21
winform中有个长时间工作需要由多线程技术完成,由于时间较长,希望在form上有个进度条来显示进度,在子线程中完成一定工作后、提供完成比例通知主线程上的进度条,但是工作失败了。通知说两个线程之间不能访问?
大家在实现如上功能的时候是通过什么方式来实现的?
...全文
2393 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzp144650 2010-01-27
  • 打赏
  • 举报
回复
用backgroundwork很方便
不老神仙 2010-01-27
  • 打赏
  • 举报
回复
学习了 很有用
wxyf3222 2008-03-20
  • 打赏
  • 举报
回复
多谢,明白。
也谢谢贵宝地了。
zhangqq111 2008-03-20
  • 打赏
  • 举报
回复
可以用事件来完成,当子线程完成工作后,触发事件,主线程接到后,做出相应的反应即事件方法。
wxyf3222 2008-03-20
  • 打赏
  • 举报
回复
借宝地一用:
[Quote=引用 4 楼 lsyxp17 的回复:]
private void myThread()//自定义线程
{
this.SetlbSendStatuText("要更新的肉容");
}
[/Quote]
我发现这个线程函数和修改控件值的函数在同一个类中,请问在线程类中该如何调用委托?是否还要创建主线程类的实例?
lsyxp17 2008-03-08
  • 打赏
  • 举报
回复
我遇到的情况是在线程中给主窗体的一个label.text赋值,用的是委托代理的方法
如下:
public partial class Form1 : Form
{
delegate void SetTextCallback(string text);//声明更新控件用的代理委托

private void SetlbSendStatuText(string text)//定义更新控件的方法
{
if (this.lbSendStatu.InvokeRequired)//lbSendStatu为主窗体中一个label控件
{
SetTextCallback d = new SetTextCallback(SetlbSendStatuText);
this.Invoke(d, new object[] { text });
}
else
{
this.lbSendStatu.Text = text;
}
}
private void myThread()//自定义线程
{
this.SetlbSendStatuText("要更新的肉容");
}
}
Love_My 2008-03-08
  • 打赏
  • 举报
回复
从线程传至到UI线程可以委托到窗体类的Invoke方法
创建线程时想传值进去的,可以再建立从线程实体类的时候先传入值
zzddl 2008-03-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Dream6000 的回复:]
多线程的数据共享可以通过:共享内存, 全局变量 来完成,,,访问时注意加锁
[/Quote]
实现不了,出现问题第一个想的就是这个办法,窗体增加一个全局变量,在子线程中修改全局变量的值,我建立一个timer去不断把全局变量的值在状态栏显示出来,但是没用,活都干完了,状态栏还是没反应
Dream6000 2008-03-07
  • 打赏
  • 举报
回复
多线程的数据共享可以通过:共享内存, 全局变量 来完成,,,访问时注意加锁
stg609 2008-03-07
  • 打赏
  • 举报
回复
.net 2.0加强了线程的安全性,所以两个线程不能直接访问,你可以通过调用委托,和invoke来进行线程间的访问.
随便写一个:

delegate void FormHandler();
private void FormWrite()
{
if (!this.InvokeRequired)
{
MessageBox.Show("你想执行的东西");
}
else
{
FormHandler fhandler = new FormHandler(FormWrite);
this.Invoke(fhandler);
}
}

111,097

社区成员

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

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

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