首页 新闻 会员 周边

Thread.Sleep(2000);和AutoResetEvent.WaitOne(2000);的区别

0
悬赏园豆:5 [待解决问题]

最近遇到这样的问题

提炼出来后的问题,如下

有一个button按钮,单击事件如下,如果使用Thread.Sleep(2000);

刷新label1,会等到Sleep结束之后,才刷新。

 AutoResetEvent auto = new AutoResetEvent(false);
        private void button2_Click(object sender, EventArgs e)
        {
            this.label1.Text = "点击了btn2";
            //Thread.Sleep(2000);
            auto.WaitOne(2000);
        }

 

 
如果使用auto.WaitOne(2000);
刷新label1是马上就刷新的,WaitOne还是等待的,但是不会影响刷新线程
 
 
从Msdn上找了相应函数的说明
Thread.Sleep();//Suspends the current thread for the specified number of milliseconds.
WaitOne();//Blocks the current thread until the current WaitHandle receives a signal, 
看用词上的区别,一个是挂起,一个是阻塞。
不过WaitOne();的时候,确定是没有人发送信号的。Set是没有调用的。
 
 
 
问题补充:

对了,我查看了下,对UI的阻塞。

的确是阻塞了UI的,但是为啥一个WaitOne可以直接刷新界面.

Sleep()必须等待足够的时间,才能刷新界面

ChuckLu的主页 ChuckLu | 小虾三级 | 园豆:514
提问于:2014-11-27 15:00
< >
分享
所有回答(3)
0

Thread.Sleep 是一定会无条件等待设置的时间

WaitOne 则不一定的,如果收到 Set() 信号,就会马上停止等待

Yu | 园豆:12980 (专家六级) | 2014-11-27 17:38

我知道这个的,关键是,我没有调用set呀。题目里也说了

支持(0) 反对(0) ChuckLu | 园豆:514 (小虾三级) | 2014-11-27 17:41
0

2个机制好像不同 sleep 是直接暂停整个进程

而waitone并不占停进程 只不过下回再次执行到waitone的时候 阻塞在这里 和lock有点相似

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2014-11-30 18:14

你说的下回是什么?我实际执行的时候,如果waitOne后面有其他代码的话,是会等待的

支持(0) 反对(0) ChuckLu | 园豆:514 (小虾三级) | 2014-11-30 19:07

@ChuckLu: 

打个比喻 第一回执行到 waitone 会过去

如果你不执行set的话 

那么下次再次执行到整个waitone的时候 

代码就回会暂停在哪一行

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2014-11-30 19:11

@小眼睛老鼠: 不是那样的,AutoResetEvent auto = new AutoResetEvent(false);

这个初始化的时候,设置成false是会暂停的。你可以测试下

支持(0) 反对(0) ChuckLu | 园豆:514 (小虾三级) | 2014-11-30 19:27

@小眼睛老鼠: 

我不记得是第一个回还是第二回 这个你可以查查  (这个我基本都没用过=。= 一般都用lock了)

但是waitone 不暂停进程 这点和sleep 的机制是不一样的

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2014-11-30 19:27

@小眼睛老鼠: 我用过了,是会暂停的。只需要再waitone后面加一个打印就知道了。会卡住的。

你说的,第一次不阻塞,是true的时候。

支持(0) 反对(0) ChuckLu | 园豆:514 (小虾三级) | 2014-11-30 19:34

@ChuckLu: 

暂停的是当前的这行代码

不是进程 sleep 会暂停和他相关的进程

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2014-11-30 19:40

@小眼睛老鼠: 我有尝试打印线程状态,是同一个状态。

waitone和sleep是处于相同的线程状态的

支持(0) 反对(0) ChuckLu | 园豆:514 (小虾三级) | 2014-11-30 19:48

@ChuckLu:

那我就不知道了 

我一直以为sleep 和suspend差不多 只不过是 限时的

而waitone 在我看来就是为了 取代 suspend才出现的 

因为suspend容易死进程

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2014-11-30 19:53

@小眼睛老鼠: 没有吧,waitone这个方法是从

WaitHandle继承来的。

之前我发现Thread有一个suspend的方法,提示说过期了

支持(0) 反对(0) ChuckLu | 园豆:514 (小虾三级) | 2014-12-01 09:01

@ChuckLu: 

我说的是设计意图

suspend

和sleep应该是一个级别的

但是由于suspend 稍微控制不好就容易出问题  所以微软停用这个方法了

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2014-12-01 09:23

@小眼睛老鼠: 无力吐槽了,不管了

支持(0) 反对(0) ChuckLu | 园豆:514 (小虾三级) | 2014-12-01 09:29
0

 我感觉应该是Sleep直接阻挡的是整个进程, 而waitone 只是挂起当前这个线程而已, 不可以在任务管理器看看进程的现成count是否有变化。

请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-11-12 15:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册