C#多线程操作控件问题
垮线程操作控件平时用控件.invoke那个函数来委托,有别的办法么,这个办法好像是进主线程操作的,如果代码多会卡软件。怎么一直不在主线程操作控件。比如多线程改窗体的名字,...
垮线程操作控件平时用控件.invoke那个函数来委托,有别的办法么,这个办法好像是进主线程操作的,如果代码多会卡软件。怎么一直不在主线程操作控件。比如多线程改窗体的名字,一秒改1000次,主程序一定卡死。我想不影响主程序,不会卡死
展开
4个回答
展开全部
一楼的答案不仅不是正解,而且还会报错!
正确的做法如下:
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里面不能有繁琐的业务操作
正确的做法如下:
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里面不能有繁琐的业务操作
展开全部
invoke 会阻塞主线程(即ui线程)
调用invoke 直到执行完毕 才返回ui线程继续执行
如果不需要等待 请用BeginInvoke (异步执行)
调用invoke 直到执行完毕 才返回ui线程继续执行
如果不需要等待 请用BeginInvoke (异步执行)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一楼正解 你是写在GuidProc这个类里面的,这个是不行的.必须写在Form的类中这是线程安全的问题啊,C#中默认不允许在控件的非创建线程中设置控件的值。,
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我是用多线程控制的,其实你也可以用定时器来做,一个效果。
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);
}
}
}
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);
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询