Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 停下来继续_C# - Fatal编程技术网

C# 停下来继续

C# 停下来继续,c#,C#,我需要一些方法在C#中高效地执行以下操作: 使程序执行停止,直到某个值更改为止 注意:我不想使用while循环来避免浪费cpu电源 编辑: 我希望它在值更改后尽快做出响应 编辑:这将在另一代码调用的我的类方法中,但是要检查的值在我的类中。。。该方法应该等待其他代码计算并更改我的值。。那么它必须继续做它的工作。。不幸的是,这样做了很多次(因此我需要关注性能) 我想这叫旋转睡眠。当然,你可以根据自己的感觉调整100。基本上是每次检查的超时时间 还有其他方法,但这是最简单的,而且效率很高 这本电子书中

我需要一些方法在C#中高效地执行以下操作:

使程序执行停止,直到某个值更改为止

注意:我不想使用while循环来避免浪费cpu电源

编辑: 我希望它在值更改后尽快做出响应

编辑:这将在另一代码调用的我的类方法中,但是要检查的值在我的类中。。。该方法应该等待其他代码计算并更改我的值。。那么它必须继续做它的工作。。不幸的是,这样做了很多次(因此我需要关注性能)

我想这叫旋转睡眠。当然,你可以根据自己的感觉调整100。基本上是每次检查的超时时间

还有其他方法,但这是最简单的,而且效率很高

这本电子书中实际引用了:

阅读本文


另请参阅适用于某些计数情况的方法。

如果在同一应用程序中的其他地方设置了等待的值,则可以使用等待句柄:

AutoResetEvent waitHandle = new AutoResetEvent();
...
//thread will sleep here until waitHandle.Set is called
waitHandle.WaitOne();
...
//this is where the value is set
someVar = someValue;
waitHandle.Set();
(请注意,WaitOne和Set必须发生在单独的线程上,因为WaitOne将阻止调用它的线程)

如果您无法访问更改值的代码,最好的方法是,如其他人所说,使用循环检查值是否已更改,并使用Thread.Sleep()以避免占用太多处理器时间:

while(!valueIsSet)
{
    Thread.Sleep(100);
}

您可以使用观察者设计模式。它是为解决像你这样的问题而设计的

该模式主要包含一个主体和一个观察者。你可以让它快速响应任何变化


您可以找到更多信息和示例代码

没有
监视器。设置
。你是说
Monitor.Pulse
还是
Monitor.pulsell
?如果你想完全睡觉而不旋转,这是一条路。但是,这要求设置值的代码知道如何在正确的对象上脉冲,否则您的代码将永远不会被唤醒。@Stephen,所以请使用属性,并在将set方法称为Windows服务时脉冲?您没有指定,在交互(事件驱动)应用程序中暂停执行也没有真正意义。您的需求是矛盾的。您拒绝忙碌等待是因为它的功耗,您要求它尽可能响应,但忙碌等待将尽可能响应。如果你告诉我们你的预算会更好。“尽可能快”告诉我们什么;“一毫秒之内”告诉了我们很多。在一毫秒内响应的解决方案可能与响应一微秒或一秒的解决方案大不相同。停止执行到底是什么意思?是不是某个持续运行的线程必须在某个点中断?你打算如何让它停止?或者它更像是一个短期事件,您希望在价值变化时发生?/同意。。。这是最好的方法如果目标是阻止线程,这是最好的方法。要在事件发生之前阻止主线程并阻止任何新输入,请将.WaitOne()放在主线程中。在另一个线程中,在触发唤醒的值所在的位置,放置.Set();如果架构允许(即,您可以控制正在监视的内容),这可能是一个很好的解决方案。您会得到非常快速的响应,因为您在更改发生后立即收到事件。主要的警告是,您是在执行更改的线程的上下文中执行的,这有时会有问题。我以前用过这个,但我不喜欢它。(所以我不会修改你的答案。)我总是觉得它“有味道”不对。@Pretzel我引用了一本书(电子书)谈论它。仅仅因为它在书中并不能说明它是对的。此外,引用作者的话,“也许它最大的用途是当程序员放弃让更复杂的信号结构工作时!”@Aren B:嘿,我没有批评它。我偶尔使用它,但我总觉得我的代码因为使用它而变得有点“脏”。像Matt Jordan一样,我也会引用这篇文章:“睡眠时间延迟越大,CPU效率就越高;折衷是延迟增加。任何超过20毫秒的事情都会产生可以忽略不计的开销”——只要你接受这样的延迟,那么我想你很好。我想我唯一的其他建议是,如果你在主要GUI线程中使用这种旋转睡眠技术,那么应该添加:Application.DoEvent(),这样GUI在等待条件满足时保持对事件(又名用户)的响应——假设你有一个GUI,也就是说。。。
while(!valueIsSet)
{
    Thread.Sleep(100);
}