如何降低无限循环的风险?

The*_*boy 0 c# enumerator infinite-loop

我们正在查看我们的代码,试图识别高CPU使用率,我正在研究我们使用while循环的几个方面.我想从下面显示的代码中冒出无限循环的风险,但我不确定最佳解决方案是什么.

IDictionaryEnumerator codeEnumerator = Resources.Error_Codes.ResourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true).GetEnumerator();
IDictionaryEnumerator messageEnumerator = Resources.Error_Messages.ResourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true).GetEnumerator();


bool codeDone = false;
bool messageDone = false;

while (codeEnumerator.MoveNext() && !codeDone)
{
    string value = codeEnumerator.Value.ToString();
    if (value == failedResponse.Code.ToString())
    {
        key = codeEnumerator.Key.ToString();
        codeDone = true;
    }
}

while (messageEnumerator.MoveNext() && !messageDone)
{
    if (messageEnumerator.Key.ToString() == key)
    {
        message = messageEnumerator.Value.ToString();
        messageDone = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*rvy 5

假设底层序列是有限的,而不是无限的(你已经说过就是这种情况)那么循环将不会永远运行.

最终你可以确定会发生以下事情之一:

  1. if会是真实的对于给定的项目,从而设置布尔和打破循环.

  2. 您将前进到序列的末尾,从而导致MoveNext错误.

  3. 将从某处抛出异常,例如从另一个线程修改的底层集合,序列中的空值或其他任何内容.因为你没有尝试/捕获,这将使你脱离循环.

特别是,由于循环的每次迭代都必须推进迭代器(由于MoveNext),因此可以确定最终会结束.