C# 子线程更新主窗体控件
1、子窗体和主窗体都属于同一UI线程,那么子窗体怎样更新主窗体控件?2、在工作线程中更新主窗体控件时,可以不用创建新的线程吧?哪位高手写个完整的例子学习一下,我自学这部分...
1、子窗体和主窗体都属于同一UI线程,那么子窗体怎样更新主窗体控件?
2、在工作线程中更新主窗体控件时,可以不用创建新的线程吧?哪位高手写个完整的例子学习一下,我自学这部分花了很多时间也搞不定,谢谢。 展开
2、在工作线程中更新主窗体控件时,可以不用创建新的线程吧?哪位高手写个完整的例子学习一下,我自学这部分花了很多时间也搞不定,谢谢。 展开
推荐于2021-01-06 · 知道合伙人软件行家
关注
展开全部
在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,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;
}
正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 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
有几种方案,你看看吧。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询