0

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;
    }
}
4

4 に答える 4

5

基礎となるシーケンスが無限ではなく有限であると仮定すると(あなたが言ったのはそうです)、ループは永遠に実行されません。

最終的には、次のいずれかが発生することを確認できます。

  1. if、特定のアイテムに対して true になるため、ブール値を設定してループから抜け出します。

  2. シーケンスの最後まで進むため、MoveNextfalse になります。

  3. 基になるコレクションが別のスレッドによって変更されたり、シーケンス内の null 値によって変更されたりするなど、どこかから例外がスローされます。try/catch がないため、これによりループから抜け出すことができます。

特に、ループの各反復は反復子を進める必要があるため ( によりMoveNext)、最終的に終了することを確認できます。

于 2013-04-30T16:29:58.663 に答える
0

あなたのコードを見て、あなたの辞書が実際に何と名付けられているかを理解しようとすると、次のようなものを探していると思います:

var key = Error_Codes.FirstOrDefault(kvp => kvp.Value.ToString = 
    failedResponse.Code.ToString()).Select(kvp => kvp.Key);
string message = string.Empty;
if(null != key)
    message = Error_Messages[key];

これは、辞書が Error_Codes と Error_Messages であることを前提としています。

Eric がコメントで指摘したように、反復子と辞書の使用方法に問題がありました。これによりイテレータの問題は解消されますが、これはまだ辞書を使用する理想的な方法ではありません。

エラー メッセージとエラー コード キーの一意のリストがある場合は、この 2 つを一緒にマップする辞書を作成できます。または、ディクショナリを、ディクショナリ キーの共通キー セットと組み合わせて、ディクショナリ値としてエラー コードとエラー メッセージのタプルを組み合わせることもできます。

于 2013-04-30T17:58:21.177 に答える
-1

ループに x 時間以上かかる場合、2 番目の条件を false に設定するタイマー/その他のスレッドを開始できます。しかし、これもきれいな解決策だとは思いません。

于 2013-04-30T16:20:17.540 に答える
-2

while ループでカウントダウンするカウンターを追加できます。カウンターの真の高さを 100 程度の値に設定し、カウンターがゼロに達したら、ループを終了します。これは、操作が完全に実行される前に終了する可能性があることを意味しますが、最終的には終了することを意味します。

于 2013-04-30T16:16:47.370 に答える