在C#中,是否存在类似于“when”语句的东西?
我需要这个是因为if
语句只会在特定时间检查某个属性是否为true
,但我希望它能够等待直到该属性变为true
。
有人知道我可以在C#中做类似于“when”语句的事情吗?
SpinWait.SpinUntil(() => condition);
它会等待,直到超时(在你指定的超时时间内)或条件得到满足。虽然没有 when
控制语句,但有两种选项可能满足您的需求:
您可以使用一个 while(predicate){}
循环来一直循环,直到满足条件。 predicate 可以是任何返回 true/false 的表达式——只要条件为真,它就会循环。如果您只想等待而不消耗太多 CPU,可以在循环中用 Sleep() 睡眠线程:
while(name == "Sebastian")
{
// Code to execute
System.Threading.Thread.Sleep(1000);
}
for
循环,但这似乎不是您想要的。name == "Sebastian"
改成你需要的了吗?记住,只要条件为 true
,它就会进入循环,所以你应该设置条件,使得 true 意味着你想再次等待,而当你的条件满足时,它变为 false。如果条件为 true,它肯定会进入循环 - 我刚试过了。 - Peter"hello"
时需要在响应中打印"world"
。这个简单的例子可以按照以下方式实现:var inputLines = new Subject<string>();
inputLines.Subscribe(info =>
{
if (info == "hello")
Console.Out.WriteLine("world");
});
while (true)
{
var line = Console.In.ReadLine();
inputLines.OnNext(line);
}
Subscribe(...)
函数中,我们传递了明确的when操作。Rx.NET
示例中,显然不必要并且不应该这样做。但在更复杂的情况下,这是一个非常有用的库。您可以看到,使用反应式扩展,您将应用程序的逻辑与主事件池分离开来,在那里您可以执行与应用程序逻辑无关的其他工作。此外,由于它非常灵活,因此您可以获得此库的高度灵活性-您可以在运行时随时订阅和取消订阅不同的事件。public static event EventHandler<string> InputEvent;
public void Run()
{
InputEvent += (sender, line) => {
if (line == "hello")
Console.WriteLine("world");
};
while (true) {
var line = Console.In.ReadLine();
InputEvent?.Invoke(this, line);
}
}
这是一个正确的观点,有时候你可以用简单的事件替换响应式扩展,因为它们是相互连接的。但是当你需要从许多事件源构建复杂的管道,并使用许多不同紧密耦合的操作时,响应式扩展允许你以非常声明性的方式构建这个管道。
EventHandler
作为委托,并从EventArgs
派生类派生。 - CodeNotFoundvar result = 0;
while(result != 6)
{
result = RollADie();
Console.WriteLine($"I rolled a {result}");
}
Console.WriteLine("At last, a six!");
但是 - 如果你正在等待某些异步事件发生,那么需要使用不同的解决方案。异步场景是指你希望你的代码“挂起并等待,什么也不做”,直到条件得到满足。
在这种情况下,现代 C# 解决方案是使用 async
和 await
关键字进行异步编程,以及 Task
类(以及它的泛型版本 Task<TResult>
)。这可能有点深入,但这里有一个相当不错的入门教程。
重要的是,你不要使用基于 while
的解决方案来处理异步进程。这只会让 CPU 不停地旋转,追逐自己的尾巴,而你真正想要的是“现在停止处理这个,直到 X 发生”。此外,出于相关原因,避免任何基于 while
结合 Thread.Sleep
的解决方案。
Task
来解决问题有些过度了。在这里,我认为简单的while(predicate)
就足够了。 - CodeNotFoundRx.NET
来处理此任务。我们可以创建一些可观察的主题,对应于我们的事件,并订阅一些特定的操作。 - Nikita Sivukhin
WHILE(true) { }
。 - Hasan Gholamali