7

私たちのライブ環境でまれに断続的なエラーが発生するという報告を受けています。私はそれを再現する試みに失敗しており、エラー自体は少し謎です. それに加えて、Enterprise Library のトレース (バージョン 5.0 を使用しています) が関係しているようです - 全体として、少し面倒です。これは Windows Sever 2008 で発生しており、アプリケーションは .Net Framework 4.0 (WPF) 上にあります。

エラー メッセージとスタック トレースは次のとおりです。

ArgumentNullException: Value cannot be null. Parameter name: category

<StackTrace>  
  Server stack trace:
  at Microsoft.Practices.EnterpriseLibrary.Logging.LogEntry.BuildCategoriesCollection(String category)
  at Microsoft.Practices.EnterpriseLibrary.Logging.Tracer.WriteTraceMessage(String message, String entryTitle, TraceEventType eventType)
  at Microsoft.Practices.EnterpriseLibrary.Logging.Tracer.WriteTraceEndMessage(String entryTitle)
  at Microsoft.Practices.EnterpriseLibrary.Logging.Tracer.Dispose()
  at TestApplication.ViewModelTest.&lt;UpdateUsers&gt;d__1a.MoveNext()

  Exception rethrown at [0]:
  at System.Runtime.CompilerServices.AsyncVoidMethodBuilder.&lt;SetException&gt;b__1(Object state)
  at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
  at System.Threading.ExecutionContext.runTryCode(Object userData)
  at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
  at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
  at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
  at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
  at System.Threading.ThreadPoolWorkQueue.Dispatch()
  at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
</StackTrace>

これを引き起こしている可能性のあるものについて誰かが光を当てることができますか?

編集: LogEntry.BuildCategoriesCollection を変更していません。メソッド BuildCategoriesCollection(String category) への入力が null です。

UpdateUsers メソッドは次のとおりです。

async void UpdateUsers()
{
    Processing = true;

    using (traceMgr.StartTrace("Trace"))
        using (var engine = new EngineClient())
        {
            Users = new List<UserMasterDataModel> { _blankUser };
            var users = await engine.GetPossibleTagsTask(SelectedOutcomeId, _queue.SystemCd, _queue.QueueCd);
            Users.AddRange(users);
        }

    if (SelectedUser != _blankUser)
    {
        // If null user selected then initialize to the case's tag, otherwise try to find the previously selected UserName
        var userNameToFind = SelectedUser == null ? _details.TagTo : SelectedUser.UserName;
        SelectedUser = Users.FirstOrDefault(user => user.UserName == userNameToFind) ?? _blankUser;

        OnPropertyChanged("SelectedUser");
    }
}
4

1 に答える 1

1

この問題は、以前のバージョンでも E-Lib の既知のバグのようです。

として知られている: 複数のスレッドからログ AB を使用する場合の未処理の例外。

「根本的な問題は、.NET 2.0 RTM では、親スレッドの操作スタックが、子が作成されるまでに存在していた場合、親スレッドの操作スタックが子と共有されていたことです。」

詳細はこちら: http://entlib.codeplex.com/workitem/9592

アプリのアーキテクチャに大きく依存するため、これに対する一般的な解決策を提案するのは困難です。

于 2013-10-05T22:58:33.080 に答える