C# 子线程更新主窗体控件

1、子窗体和主窗体都属于同一UI线程,那么子窗体怎样更新主窗体控件?2、在工作线程中更新主窗体控件时,可以不用创建新的线程吧?哪位高手写个完整的例子学习一下,我自学这部分... 1、子窗体和主窗体都属于同一UI线程,那么子窗体怎样更新主窗体控件?
2、在工作线程中更新主窗体控件时,可以不用创建新的线程吧?哪位高手写个完整的例子学习一下,我自学这部分花了很多时间也搞不定,谢谢。
展开
 我来答
greystar_cn
推荐于2021-01-06 · 知道合伙人软件行家
greystar_cn
知道合伙人软件行家
采纳数:16407 获赞数:17260
本人主要从事.NET C#方向的技术开发工作,具有10多年的各类架构开发工作经验。

向TA提问 私信TA
展开全部
在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。
正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。
而所谓的“一面响应操作,一面添加节点”永远只能是相对的,使 UI 线程的负担不至于太大而已,因为界面的正确更新始终要通过 UI 线程去做,我们要做的事情是在工作线程中包揽大部分的运算,而将对纯粹的界面更新放到 UI 线程中去做,这样也就达到了减轻 UI 线程负担的目的了。
再举个简单例子说明下使用方法,比如你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox..

using System.Threading;
public delegate void MyInvoke(string str);
private void btnStartThread_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(DoWord));
thread.Start();
}
public void DoWord()
{
MyInvoke mi = new MyInvoke(SetTxt);
BeginInvoke(mi,new object[]{"abc"});
}
public void SetTxt(string str)
{
txtReceive.Text += str + System.Environment.NewLine;
}
追问
您好,上面的代码是不是用的子窗体更新主窗体textbox?若是的话,有必要在子窗体中创建线程更新吗?直接把textbox传给子窗体,进而在子窗体中直接更新,这样可以吗?
追答
控件的调用必需是主线程,不能是工作线程。

http://www.cnblogs.com/TankXiao/p/3348292.html
有几种方案,你看看吧。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式