解决方案 »
- 求解关于winform绑定数据之后的自增RowValidated事件问题……
- 我想找个关于win32 api的msdn中文的,谁帮忙找个下载地址,我找不到。
- 小数点的取数问题?
- 求助!继承自System.Web.UI.Page类中使用 session 遇到的问题
- 求学.NET意见
- datagridview 问题
- 【菜鸟求助】checkedbox的问题
- 类似于VB中的判断是否是整数、小数等等一些很基本的函数,我在c#中怎么找不到,c#有这些函数吗
- 小分问一下关于C#中大量使用try catch对系统性能问题!
- 求助帖,帮忙看段代码!!!
- c#如何开启关闭IIS日志记录 = =|
- 组合按钮怎么实现?
Application.DoEvents();
Thread.Sleep(2000);
label1.Text = "world";
Application.DoEvents();
{
[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public static void DoEvents()
{
DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(ExitFrames), frame);
try { Dispatcher.PushFrame(frame); }
catch (InvalidOperationException) { }
}
private static object ExitFrames(object frame)
{
((DispatcherFrame)frame).Continue = false;
return null;
}
}
用定时器就是可以了,第一次赋值之后,启动一个2秒的定时器,定时器触发的时候修改Label。直接在主线程里Sleep,由于无法刷新,第一次赋值的内容是看不到的。
Thread th = new Thread(() =>
{
this.Invoke(new MethodInvoker(() => { label1.Text = "Hello"; }));
Thread.Sleep(5000);
this.Invoke(new MethodInvoker(() => { label1.Text = "World"; }));
});
th.Start();
所以可以用线程+委托:
Thread aa;
public void BtnControl()
{
Thread.Sleep(2000);
label1.Invoke(new MethodInvoker(delegate
{
label1.Text = "bbb";
}));
aa.Abort();
}
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "aaa";
aa = new Thread(new ThreadStart(BtnControl));
aa.Start();
}
你应该理解,在事件改变Label的值与界面重绘是在同一个线程,就是改变值跟重绘是顺序来做的(这个过程界面会卡住”无法响应“),最后等到事件结束了才将最后的结果绘制出来。所以要实现这样的效果,思路应该是赋值Label的值,释放控件线程让它重绘。在其他线程等待2s后,再触发个事件为Label赋第二次值。#3,#7,#9,#13楼应该都能实现你要的效果吧。
#13楼简化:
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "Hello";
new Thread(delegate()
{
Thread.Sleep(2000);
label1.BeginInvoke(new MethodInvoker(() =>
{
label1.Text = "World";
}));
}).Start();
}