最近遇到这样的问题
提炼出来后的问题,如下
有一个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); }
对了,我查看了下,对UI的阻塞。
的确是阻塞了UI的,但是为啥一个WaitOne可以直接刷新界面.
Sleep()必须等待足够的时间,才能刷新界面
Thread.Sleep 是一定会无条件等待设置的时间
WaitOne 则不一定的,如果收到 Set() 信号,就会马上停止等待
我知道这个的,关键是,我没有调用set呀。题目里也说了
2个机制好像不同 sleep 是直接暂停整个进程
而waitone并不占停进程 只不过下回再次执行到waitone的时候 阻塞在这里 和lock有点相似
你说的下回是什么?我实际执行的时候,如果waitOne后面有其他代码的话,是会等待的
@ChuckLu:
打个比喻 第一回执行到 waitone 会过去
如果你不执行set的话
那么下次再次执行到整个waitone的时候
代码就回会暂停在哪一行
@小眼睛老鼠: 不是那样的,AutoResetEvent auto = new AutoResetEvent(false);
这个初始化的时候,设置成false是会暂停的。你可以测试下
@小眼睛老鼠:
我不记得是第一个回还是第二回 这个你可以查查 (这个我基本都没用过=。= 一般都用lock了)
但是waitone 不暂停进程 这点和sleep 的机制是不一样的
@小眼睛老鼠: 我用过了,是会暂停的。只需要再waitone后面加一个打印就知道了。会卡住的。
你说的,第一次不阻塞,是true的时候。
@ChuckLu:
暂停的是当前的这行代码
不是进程 sleep 会暂停和他相关的进程
@小眼睛老鼠: 我有尝试打印线程状态,是同一个状态。
waitone和sleep是处于相同的线程状态的
@ChuckLu:
那我就不知道了
我一直以为sleep 和suspend差不多 只不过是 限时的
而waitone 在我看来就是为了 取代 suspend才出现的
因为suspend容易死进程
@小眼睛老鼠: 没有吧,waitone这个方法是从
WaitHandle继承来的。
之前我发现Thread有一个suspend的方法,提示说过期了
@ChuckLu:
我说的是设计意图
suspend
和sleep应该是一个级别的
但是由于suspend 稍微控制不好就容易出问题 所以微软停用这个方法了
@小眼睛老鼠: 无力吐槽了,不管了
我感觉应该是Sleep直接阻挡的是整个进程, 而waitone 只是挂起当前这个线程而已, 不可以在任务管理器看看进程的现成count是否有变化。