private void button1_Click(object sender, EventArgs e)
{ label1.Text = "hello"; Thread.Sleep(2000); label1.Text = "world"; }
题目可能描述的不清楚,我举个例子吧,比如如上这段代码,我原意是让Label的内容为hello,然后过了2S以后,再让它的内容变成world,但实际运行时是程序暂停2S之后Label的内容直接变成world的,一开始也不显示hello,那么怎么做才能让它按照我的原意显示?
—-
用线程…
—-
—- 5分
label1.Text = “hello”;
Application.DoEvents();
Thread.Sleep(2000);
label1.Text = “world”;
Application.DoEvents();
Thread.Sleep(2000);
label1.Text = “world”;
—-
楼上的正解。主要是
Application.DoEvents();
Application.DoEvents();
—-
这个确实可以,但在WPF中好像没有这个方法
—- 5分
public static class DispatcherHelper
{
[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;
}
}
{
[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。
用定时器就是可以了,第一次赋值之后,启动一个2秒的定时器,定时器触发的时候修改Label。
直接在主线程里Sleep,由于无法刷新,第一次赋值的内容是看不到的。
—-
该回复于2014-11-26 10:36:54被管理员删除
—-
Thread th = new Thread(() => { this.Invoke(new MethodInvoker(() => { label1.Text = "Hello"; })); Thread.Sleep(5000); this.Invoke(new MethodInvoker(() => { label1.Text = "World"; })); }); th.Start();
—-
这段代码我在网上也搜到过,但用的时候会提示未能找到类型或命名空间名称“DispatcherFrame”(是否缺少 using 指令或程序集引用?)不知道该添加哪个命名空间?
—-
Application.DoEvents(); 让界面显示下
—-
Web里面可以用前台的js加定时器处理,后台的话还真没碰到过
—-
首先时间对象也是一个线程,
所以可以用线程+委托:
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();
}
所以可以用线程+委托:
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();
}
—- 10分
楼主的那段代码应该曾被多少人梦想过啊~~我当年也幻想能这样做的。
你应该理解,在事件改变Label的值与界面重绘是在同一个线程,就是改变值跟重绘是顺序来做的(这个过程界面会卡住”无法响应“),最后等到事件结束了才将最后的结果绘制出来。
你应该理解,在事件改变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();
}
CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#如何在同一事件中改变Label控件内容多次!