很多初学者都会碰到这样的问题:循环体内改变窗体Label控件的属性,窗体会假死,值也不会变,直到循环体完了Label才会显示最后的值。设断点会发现其实Label的值已经更改了,只是UI没有重新绘制,还是老样子,如果加上label.Refresh();你会发现其实单线程也可以达到你想要的效果,只不过窗体还是假死状态,因为主线程这会比较忙没有空去重新Paint窗体及其控件。多线程不用多说,Timer是个最简单的例子,Tick事件{//your code} soeasy多线程之所以不用刷新是因为主线程空闲,只要Label值发生变化,就会重新绘制
跨线程访问主窗体控件必须使用委托: int i = 0;
public void test()
{
while (i<100000)
{
this.Invoke
(
(MethodInvoker)delegate()
{
label1.Text = i.ToString();
}
);
i += 100;
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread((ThreadStart)delegate()
{
test();
});
th.Start();
}
发这个的目的很简单,有进度条的,或者给用户进度提示的,如果你不想用多线程或者异步操作,值改变一次,你Refresh一次也可以达到效果
跨线程访问主窗体控件必须使用委托: int i = 0;
public void test()
{
while (i<100000)
{
this.Invoke
(
(MethodInvoker)delegate()
{
label1.Text = i.ToString();
}
);
i += 100;
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread((ThreadStart)delegate()
{
test();
});
th.Start();
}
发这个的目的很简单,有进度条的,或者给用户进度提示的,如果你不想用多线程或者异步操作,值改变一次,你Refresh一次也可以达到效果
解决方案 »
- 怎样打印DataGridView
- c#中怎样将uft8编码转换为gb2312编码
- C#中Datagridview滚动条和数据的问题
- 网上找的‘Raw Socket编程实现网络封包监视’为什么数据包内容是乱码?
- 求大神帮帮我……
- 新手求助!关于指定字符串截取的问题
- .net 2005中treeview控件为何不能显示折叠/展开图标?
- 谁有将XML转换成EXCEL的例子?最好提供资料或者源代码!
- 新手 c++ 结构 与 C# 互转
- 郁闷,IDbDataAdapter.Fill( DataSet )填充DataSet时,两个不同SQL语句却把结果整合到一个表中了
- C#注册表怎么读取数据转换成bool类型不报错呢?急急急!
- c#和kodak的imgedit,做图像的缩放、旋转、裁剪、显示的问题
使用 TimerCallback 委托指定希望 Timer 执行的方法。计时器委托在构造计时器时指定,并且不能更改。此方法不在创建计时器的线程上执行,而是在系统提供的 ThreadPool 线程上执行。这不是多线程是什么?
UI的不是
它是按你指定的时间间隔来触发事件的,UI线程用于执行处理