首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ManualResetEvent与时间循环

ManualResetEvent与时间循环
EN

Stack Overflow用户
提问于 2013-12-09 06:50:23
回答 2查看 1.5K关注 0票数 0

ManualResetEvent基本上对其他线程说,“只有当收到要继续的信号时,才能继续执行”,并用于暂停某些线程的执行,直到满足特定条件为止。我想问的是,为什么我们可以轻松地使用while循环来实现我们想要的ManualResetEvent呢?考虑以下情况:

代码语言:javascript
复制
public class BackgroundService {

ManualResetEvent mre;
public BackgroundService() {
    mre = new ManualResetEvent(false);
}
public void Initialize() {
    // Initialization
    mre.Set();
}

public void Start() {
    mre.WaitOne();
    // The rest of execution
}
}

有点类似于

代码语言:javascript
复制
public class BackgroundService {

bool hasInitialized;
public BackgroundService() {

}
public void Initialize() {
    // Initialization
    hasInitialized = true;
}

public void Start() {
    while (!hasInitialized)
    Thread.Sleep(100);
    // The rest of execution
}
}

有什么特定的上下文比while循环更适合ManualResetEvent?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-09 06:53:50

有什么特定的上下文比while循环更适合ManualResetEvent?

绝对一点儿没错。有两个主要原因:延迟和效率。

上下文-切换线程来重新启动它是相对昂贵的,当它将要回到睡眠状态时,您给出的方法将平均需要50 is来响应设置的hasInitialized变量--假设它是完全响应的。(您没有任何显式的内存屏障,因此线程可能根本看不到变量的更改。我怀疑调用Thread.Sleep实际上增加了一个内存屏障,但这并不一定。)使用OS/CLR级别的同步原语,线程可以更快地响应.

票数 3
EN

Stack Overflow用户

发布于 2013-12-09 06:58:38

使用像ManualResetEvent这样的信号是更有效的。使用while循环意味着大约每100毫秒(即每秒10次)之后,其他线程必须停止运行,所以检查条件的线程必须运行,当条件大多为false时,这个上下文切换效率较低。

但是,在代码中有些东西闻起来很可疑,为什么在初始化时会有这样的代码轮询呢?如果初始化是异步的,则已经有一些通知机制,例如回调,这样就没有必要进行轮询了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20464787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档