Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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#中是否有'when()'语句或类似语句?_C#_.net - Fatal编程技术网

C#中是否有'when()'语句或类似语句?

C#中是否有'when()'语句或类似语句?,c#,.net,C#,.net,在C#中是否有类似“when”的语句 我之所以希望这样做,是因为if语句在特定时间仅检查一次某个属性是否为true,但我希望它等待直到该属性为true 有人知道我可以用C语言做什么类似于“when”语句吗?你可以使用“async”和“wait”来等待某个“任务”完成wait与您需要的when语句有点类似。只是它会暂停当前的“任务”,直到等待的“任务”完成并产生任何结果,而不仅仅是当表达式变为“true”时。另请参见。当控制语句时,没有,但有两个选项可以满足您的需要: 您可以使用while(谓词)

在C#中是否有类似“when”的语句

我之所以希望这样做,是因为
if
语句在特定时间仅检查一次某个属性是否为
true
,但我希望它等待直到该属性为
true


有人知道我可以用C语言做什么类似于“when”语句吗?

你可以使用“async”和“wait”来等待某个“任务”完成wait与您需要的when语句有点类似。只是它会暂停当前的“任务”,直到等待的“任务”完成并产生任何结果,而不仅仅是当表达式变为“true”时。另请参见。

当控制语句时,没有
,但有两个选项可以满足您的需要:

您可以使用
while(谓词){}
循环来保持循环,直到满足条件为止。谓词可以是任何返回true/false的表达式-只要条件为true,它就会循环。如果只想等待而不消耗太多CPU,可以在循环中休眠()线程:

while(name == "Sebastian")
{
    // Code to execute
    System.Threading.Thread.Sleep(1000);
}
如果您的属性是一个数值范围,您可以为循环使用
,但这听起来不像您想要的。

您想要的是

e、 g.
SpinWait.spinUtil(()=>条件)


它将一直保持在那里,直到超时(指定的超时)或满足条件。

如果您想处理异步世界,请查看库。让我们看一个简单的例子:假设您想从控制台读取字符串,当用户输入word
“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);
}

这是一个正确的观点,有时候你可以用简单的事件替换被动扩展,因为它们是连接的。但是当您需要从许多事件源并使用许多不同的紧密耦合操作构建复杂的管道时,反应式扩展允许您以非常声明的方式很好地构建这个管道。

您在这里想要实现什么?您是在运行同步进程,还是在等待异步事件发生

如果您是同步的,那么
while
可能是正确的解决方案:

var result = 0;
while(result != 6)
{
    result = RollADie();
    Console.WriteLine($"I rolled a {result}");
}
Console.WriteLine("At last, a six!");
但是-如果您正在等待异步的事情发生,那么需要一个不同的解决方案。异步场景是希望代码“挂起等待,什么也不做”,直到条件满足为止

在这种情况下,现代C#解决方案是使用
async
await
关键字以及
Task
类(它是
Task
的泛型近亲)进行异步编程。这可能有点深奥,但是


重要的是不要使用基于
while
的解决方案来处理异步进程。当你真的想说“现在停止工作,直到X发生”的时候,你只需要让CPU旋转一圈,追逐它自己的尾巴。另外,避免任何基于
while
Thread.Sleep
的解决方案,因为相关的原因。

最好用你的代码来理解你的提议,但如果我明白你的意思,那就是
while(true){}
我认为你通过
任务
给出了一个解决方案。简单的
while(谓词)
在这里就足够了。这在很大程度上取决于OP的“while”循环可能会导致繁忙的等待。我假设,“何时”暗示等待同一进程的其他部分将某些条件设置为true,因此任务或线程。如果需要等待一些异步事件,则可以考虑库<代码> Rx.NET/COD>来处理此任务。我们可以创建一些与我们的活动相对应的可观察主题,并订阅一些特定的活动。@NikitaSivukhin你应该这样回答。使用c#5年了,仍然遇到我从未听说过的事情!如果你想浪费电能,让你的电脑做很多浪费性的计算,这个方法是完美的。有一个@TheGeneral,但是如果你等一段时间,你总是可以在这种情况下保持睡眠。我需要某种“使用”吗?我找不到它:SpinWait通常对普通应用程序不有用。在大多数情况下,您应该使用.NET Framework提供的同步类,例如Monitor.Nice解决方案和.NET事件。但是,如果要传递参数,建议使用
EventHandler
作为委托和来自
EventArgs
的派生类。我使用了此方法,但它没有在while循环中执行代码。您是否将示例
name==“Sebastian”
更改为您需要的格式?请记住,每次条件为
true
,它都会进入循环,因此您应该设置条件,使true表示您希望再次等待,当满足条件时,它将变为false。如果条件为真,肯定会进入循环-我刚刚尝试过。
var result = 0;
while(result != 6)
{
    result = RollADie();
    Console.WriteLine($"I rolled a {result}");
}
Console.WriteLine("At last, a six!");