2016-07-25 16 views
-1

ログファイルで以下の例外が発生しました。System.ArgumentOutOfRangeExceptionパラメーター名:System.Text.StringBuilder.ToString()のchunkLength

「System.ArgumentOutOfRangeExceptionが:インデックスが範囲外だった負の非とコレクションのサイズよりも小さくなければなりません パラメータ名:。。System.Text.StringBuilder.ToStringでchunkLength ()」

これはスレッドセーフではない文字列ビルダーのためだと私は信じています。しかし、私は下の再帰関数でスレッドセーフにスレッドビルダーを作る方法につまらないです。

アイデアをお寄せいただきありがとうございます。ありがとう。

public static class StringExtensions 
{ 
    /// <summary> 
    /// The log key builder 
    /// </summary> 
    private static StringBuilder logKeyBuilder; 

    public static string ConcatLogKeyWithExceptionMessage<T>(this T entity, string configuredLogKeys, bool logOnlySingleKey, string exceptionMessage, bool firstInvocation = true) where T : class 
    { 
     logKeyBuilder = logKeyBuilder ?? new StringBuilder(); 

     if (entity != null) 
     { 
      var objType = entity.GetType(); 
      var properties = objType.GetProperties(); 
      foreach (var property in properties) 
      { 
       var propValue = property.GetValue(entity, null); 
       var elems = propValue as IList; 
       if (elems != null) 
       { 
        foreach (var item in elems) 
        { 
         { 
          ConcatLogKeyWithExceptionMessage(item, configuredLogKeys, logOnlySingleKey, exceptionMessage, false); 
         } 
        } 
       } 
       else 
       { 
        // This will not cut-off System.Collections because of the first check 
        if (property.PropertyType.Assembly == objType.Assembly) 
        { 
         ConcatLogKeyWithExceptionMessage(propValue, configuredLogKeys, logOnlySingleKey, exceptionMessage, false); 
        } 
        else 
        { 
         configuredKeysArray = configuredKeysArray ?? (!string.IsNullOrEmpty(configuredLogKeys) ? configuredLogKeys.Split(',') : new string[0]); 

         foreach (var configLogKey in configuredKeysArray) 
         { 
          if (string.Compare(configLogKey.Trim(), property.Name.Trim(), StringComparison.OrdinalIgnoreCase) == 0) 
          { 
           configuredKeysArray = configuredKeysArray.Where(x => x != configLogKey).ToArray(); 
           logKeyBuilder.Append(property.Name); 
           logKeyBuilder.Append(" "); 
           logKeyBuilder.Append("-"); 
           logKeyBuilder.Append(" "); 
           logKeyBuilder.Append(property.GetValue(entity)); 
           logKeyBuilder.Append(" "); 
           if (logOnlySingleKey) 
           { 
            break; 
           } 
          } 
         } 
        } 
       } 
      } 
     } 

     logKeyBuilder = firstInvocation ? logKeyBuilder.Append(exceptionMessage) : logKeyBuilder; 
     return logKeyBuilder.ToString(); 
    } 
} 

答えて

0

使用してロック:

private static object lockObject = new object(); 
public static string ConcatLogKeyWithExceptionMessage<T>(this T entity, string configuredLogKeys, bool logOnlySingleKey, string exceptionMessage, bool firstInvocation = true) where T : class 
{ 
    lock(lockObject) 
    { 
     // rest of your code here 
    } 
} 

やメソッド内のローカル変数であるためにあなたの静的フィールドを移動します。

+0

しかし、これはマルチスレッド環境でのパフォーマンスに影響する可能性がありますか。私はロックを持たないソリューションを探しています –

+0

@ChandraMohanなぜあなたは静的フィールドとしてあなたのビルドを持っていますか? – user3185569

+0

いいえstringbuilderを静的にする特別な理由。 resharperが提案したように、私はそれを静的なものにしました。これをローカル変数として私の静的メソッドに提出すれば問題は解決されますか?しかし、私の静的メソッドは再帰的メソッドです。 –

関連する問題