C#多线程操作控件问题

垮线程操作控件平时用控件.invoke那个函数来委托,有别的办法么,这个办法好像是进主线程操作的,如果代码多会卡软件。怎么一直不在主线程操作控件。比如多线程改窗体的名字,... 垮线程操作控件平时用控件.invoke那个函数来委托,有别的办法么,这个办法好像是进主线程操作的,如果代码多会卡软件。怎么一直不在主线程操作控件。比如多线程改窗体的名字,一秒改1000次,主程序一定卡死。我想不影响主程序,不会卡死 展开
 我来答
rightmin
2012-04-13 · TA获得超过4124个赞
知道大有可为答主
回答量:2199
采纳率:0%
帮助的人:1799万
展开全部
一楼的答案不仅不是正解,而且还会报错!
正确的做法如下:

Thread th = new Thread(new ThreadStart(() =>
{
while (true)
{
Thread.Sleep(1000);//繁琐的操作,或者IO等待放在这个线程里面操作
this.Invoke(new Action(() =>
{//当需要操作界面元素时,需要用Invoke,注意这里面不能有繁琐的操作
this.Text = (i++).ToString();
//Thread.Sleep(1000);如果这么写,就会卡住主线程
}));
}
}));
th.IsBackground = true;//一定要标记为后台线程,这样这个线程才能在你的主线程停止后自动停止
th.Start();

总之一句话,繁琐的业务操作放在非主线程里面去执行,或者用BackgroundWorker去执行,当需要操作界面元素时用Invoke,但是在Invoke里面不能有繁琐的业务操作
NA009
2012-04-13 · TA获得超过579个赞
知道小有建树答主
回答量:331
采纳率:0%
帮助的人:268万
展开全部
invoke 会阻塞主线程(即ui线程)
调用invoke 直到执行完毕 才返回ui线程继续执行

如果不需要等待 请用BeginInvoke (异步执行)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bhfa2012
2012-04-13
知道答主
回答量:52
采纳率:0%
帮助的人:23.9万
展开全部
一楼正解 你是写在GuidProc这个类里面的,这个是不行的.必须写在Form的类中这是线程安全的问题啊,C#中默认不允许在控件的非创建线程中设置控件的值。,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
libinhao1111
2012-04-12 · TA获得超过1014个赞
知道小有建树答主
回答量:425
采纳率:0%
帮助的人:556万
展开全部
我是用多线程控制的,其实你也可以用定时器来做,一个效果。
public partial class Form2 : Form
{
int i = 0;
public Form2()
{
InitializeComponent();
this.Text = "Hello";
Thread th = new Thread(ChangeName);
th.Start();
}

public void ChangeName()
{
while (true)
{
this.Text = (i++) + "";
Thread.Sleep(1);
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式