Control.Invoke、BeginInvoke疑问

myspeciality 2014-06-25 03:04:00
大家好,

有一段代码,为什么Thread.Sleep(300)的位置不同,导致执行结果也不相同呢?谢谢解答。

Winform界面上放置一个按钮button1,点击按钮更改它的Text:从0到9:


private void button1_Click(object sender, EventArgs e) {
Thread tr = new Thread(
() => {
for (int i = 0; i < 10; i++) {
this.Invoke((EventHandler)delegate {
button1.Text = i.ToString();
//Thread.Sleep(100); // 如果Sleep放在此处,界面会假死,且不会有数字递增的效果
});

Thread.Sleep(100); // 如果Sleep放在此处,OK
}
}
);

tr.Start();
}
...全文
124 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
CGabriel 2014-06-26
  • 打赏
  • 举报
回复
表面上, this.Invoke 里面的匿名方法是在后台线程里面的。但是实际上 Control.Invoke 把这个匿名方法发送到 UI 线程上了。 所以界面冻结了。 如果 Thread.Sleep 不在匿名方法里面则不会冻结界面。
myspeciality 2014-06-26
  • 打赏
  • 举报
回复
顶一下。请大家帮忙解答
myspeciality 2014-06-26
  • 打赏
  • 举报
回复
引用 6 楼 xdashewan 的回复:
[quote=引用 5 楼 myspeciality 的回复:] 为什么ManagedThreadId 3不一样呢?
Thread tr = new Thread,ManagedThreadId 3不是你自己new出来的新线程吗,id当然不一样啊[/quote] 你速度真快。我刚起来new了一个线程。谢谢。
xdashewan 2014-06-26
  • 打赏
  • 举报
回复
引用 5 楼 myspeciality 的回复:
为什么ManagedThreadId 3不一样呢?
Thread tr = new Thread,ManagedThreadId 3不是你自己new出来的新线程吗,id当然不一样啊
myspeciality 2014-06-26
  • 打赏
  • 举报
回复
谢谢上面3位。 Windows窗体程序只能通过创建控件的线程来操作控件的数据。所以Control.Invoke是UI线程的执行的。 我加了线程ID输出:

MessageBox.Show("Thread.CurrentThread.ManagedThreadId 1:" + Thread.CurrentThread.ManagedThreadId);
            Thread tr = new Thread(
                () => {
                    for (int i = 0; i < 1; i++) {
                        this.Invoke((EventHandler)delegate {
                            MessageBox.Show("Thread.CurrentThread.ManagedThreadId 2:" + Thread.CurrentThread.ManagedThreadId);
                            button1.Text = i.ToString();
                            //Thread.Sleep(100);
                        });

                        MessageBox.Show("Thread.CurrentThread.ManagedThreadId 3:" + Thread.CurrentThread.ManagedThreadId);
                        Thread.Sleep(100);
                    }
                }
            );
通过上面3处打印的线程ID,我们会知道ManagedThreadId 1 = ManagedThreadId 2 != ManagedThreadId 3。 为什么ManagedThreadId 3不一样呢?
exception92 2014-06-25
  • 打赏
  • 举报
回复
可以看看这个, http://msdn.microsoft.com/zh-cn/library/zyzhdc6b(v=vs.110).aspx 如果使用委托,就不会出错。看自己的理解了。
暈哥 2014-06-25
  • 打赏
  • 举报
回复
你注释的那句sleep是在UI线程执行的

110,577

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧