如何在没有循环的情况下等待布尔值(使用任何类型的wait/semaphore/event/mutex等)

Ign*_*cia 18 .net c# multithreading mutex semaphore

我需要停止一个线程,直到另一个线程设置一个布尔值,我不想在它们之间共享一个事件.

我目前所拥有的是使用Sleep的以下代码(这是我想要更改的代码):

while (!_engine.IsReadyToStop())
{
    System.Threading.Thread.Sleep(Properties.Settings.Default.IntervalForCheckingEngine); 
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑澄清事:

我不拥有一个名为_engine的对象.我无法修改它,这就是为什么我不想在它们之间共享事件.我需要等到该类的方法返回true.

Moo*_*tom 27

SpinWait.SpinUntil无论你在哪里放置这段代码,都是正确的答案.SpinUntil提供"在调用之间旋转,屈服和睡眠的良好组合".


Tig*_*ran 12

如果您正在使用C# 4.0,您可以使用:

Task t = Task.Factory.StartNew (() => SomeCall(..));
t.Wait();
Run Code Online (Sandbox Code Playgroud)

通过使用Task.Wait方法.

如果您有多个任务一个接一个地运行,您可以使用Task.ContinueWith:

 Task t = Task.Factory.StartNew (() =>SomeCall(..)).
                                ContinueWith(ExecuteAfterThisTaskFinishes(...);
 t.Wait();
Run Code Online (Sandbox Code Playgroud)

  • 产生任务并立即加入任务有什么意义?我不认为这是OP的问题. (2认同)