C# 手动复位事件vs while循环

C# 手动复位事件vs while循环,c#,manualresetevent,C#,Manualresetevent,ManualResetEvent基本上对其他线程说“只有在收到继续信号时才能继续”,并用于暂停某些线程的执行,直到满足某些条件为止。我想问的是,为什么我们可以通过使用while循环轻松实现我们想要的呢?考虑下面的上下文: public class BackgroundService { ManualResetEvent mre; public BackgroundService() { mre = new ManualResetEvent(false); } public void I

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

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
}
}
有点像

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
}
}
是否存在ManualResetEvent比while循环更适合的特定上下文

是否存在ManualResetEvent比while循环更适合的特定上下文

当然。有两个主要原因:延迟和效率

上下文切换线程以使其重新开始运行的成本相对较高,此时它将返回睡眠状态,并且您给出的方法将平均花费50毫秒来响应设置的
hasInitialized
变量-假设它完全响应。(您没有任何明确的内存障碍,因此线程可能根本看不到变量的更改。我怀疑调用
thread.Sleep
会有效地增加内存障碍,但这并不能保证。)使用OS/CLR级别的同步原语,线程可以更快地响应

是否存在ManualResetEvent比while循环更适合的特定上下文

当然。有两个主要原因:延迟和效率

上下文切换线程以使其重新开始运行的成本相对较高,此时它将返回睡眠状态,并且您给出的方法将平均花费50毫秒来响应设置的
hasInitialized
变量-假设它完全响应。(您没有任何明确的内存障碍,因此线程可能根本看不到变量的更改。我怀疑调用
thread.Sleep
会有效地增加内存障碍,但这并不能保证。)使用OS/CLR级别的同步原语,线程可以更快地响应

是否存在ManualResetEvent比while循环更适合的特定上下文

当然。有两个主要原因:延迟和效率

上下文切换线程以使其重新开始运行的成本相对较高,此时它将返回睡眠状态,并且您给出的方法将平均花费50毫秒来响应设置的
hasInitialized
变量-假设它完全响应。(您没有任何明确的内存障碍,因此线程可能根本看不到变量的更改。我怀疑调用
thread.Sleep
会有效地增加内存障碍,但这并不能保证。)使用OS/CLR级别的同步原语,线程可以更快地响应

是否存在ManualResetEvent比while循环更适合的特定上下文

当然。有两个主要原因:延迟和效率


上下文切换线程以使其重新开始运行的成本相对较高,此时它将返回睡眠状态,并且您给出的方法将平均花费50毫秒来响应设置的
hasInitialized
变量-假设它完全响应。(您没有任何显式内存障碍,因此线程可能根本看不到变量的更改。我怀疑调用
thread.Sleep
会有效地增加内存障碍,但不能保证。)使用OS/CLR级别的同步原语,线程的响应速度要快得多。

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


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

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


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

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


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

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

然而,代码中有些东西闻起来很可疑,为什么会有这样的代码