我需要不断检查状况。不是在每个循环迭代中,而是在函数执行期间。
这样的事情是不可接受的:
while(condition)
{
...
}
当条件显示为真时,我只需要在进度的“中间”中止功能。 有什么想法吗?
答案 0 :(得分:4)
当条件显示为真时,我只需要在进度的“中间”中止功能。有什么想法吗?
在进度[*]中间没有“简单”的方法来中止函数,这是一件好事。在中间中止函数可能会使系统处于不一致状态(想象在写入文件的过程中中止)。
正确的方法是在您的功能中识别可能发生中断的“安全点”并在那里进行检查:
... // some statement
if (condition) return;
... // some more statements
if (condition) return;
...
脚注:[*]当我说没有简单的方法可以中止某个功能时,我在撒谎。有一个,它被称为Thread.Abort
(你需要在一个单独的线程中运行你的函数,并监视另一个线程中的condition
,通常是主UI线程)。但是,出于上述原因,不鼓励使用Thread.Abort 高度。不要这样做。
答案 1 :(得分:1)
我认为你需要重新考虑你想要的东西。对你的问题最直接的答案是你可以在循环中检查,如果条件为真则中断,你可以多次这样做。
但实际上你所拥有/需要的东西似乎更有可能是后台进程,并且通过循环的额外传递并不重要,你只需要一种方法来在ALTERNATE条件为真时停止它。为此,后台线程可能就是答案。
答案 2 :(得分:0)
答案 3 :(得分:0)
答案 4 :(得分:0)
C#中没有预定义的构造可以自动执行您的想法。不是我实际意识到的。你必须自己实现它。
使用bool
返回值检查某个函数中的条件。
并且在您想要查看它的地方调用该函数并检查该函数的调用是否返回false
(例如),在您可以使用break
,return
任何执行中断指令之后你想要(基于呼叫上下文)。
希望这有帮助。
答案 5 :(得分:0)
break
语句可以让你脱离循环。至于一个监听条件变化的机制,依赖于while循环并不会像编译器达到范围的最后那样有效地注册条件不再有效。
也许你可以创建自己的事件处理程序?
答案 6 :(得分:0)
您的问题的一个答案是:启动一个单独的Thread
来执行工作,并检查主线程中的条件。当条件发生变化时,您可以Abort()
工作线程,立即将其关闭。
但是你会让系统处于未知状态,因为Abort()
会立即关闭线程,所以一般来说这是一个坏主意。
不幸的是,更好的解决方案是检查循环内多个位置的条件。
答案 7 :(得分:0)
假设这是某种错误处理断言条件 - 看看.NET Code Contracts和ContractInvariantMethod,有一个很好的例子here。
它允许您定义不允许发生的条件,并且如果它在运行时发生则会导致断言。
以下内容摘自链接。它强制平衡永远不会是负面的,否则会发生异常。
class Account
{
private int balance
[ContractInvariantMethod]
private void BalanceHasToAlwaysBeInTheBlack()
{
// Note to reader: only conditions can be in here
Contract.Invariant(balance >= 0)
}
public void Deposit(int amount)
{
Contract.Requires(amount > 0)
Contract.Ensures(balance > amount) // Note to reader: you can also ensure on the returned object e.g. Contract.Ensures(Contract.Result<int>() > 0)
balance += amount
}
public void Withdraw(int amount)
{
Contract.Requires(amount > 0)
balance -= amount
}
}