2017-09-28 4 views
0

「セッション」ごとに別々のLifetimeScopeとワーカースレッドで長時間実行される解決策があります。 タイミングの問題が発生する不安定なエラーが発生しています。これは、実際の解像度が終了する前に、生涯スコープが廃棄/作成されたときに発生します。間欠ライ​​フタイムスコープエラー:SelfRegistrationCannotBeActivated

例外は少し不可解であるので、私は一種の無知だ - 下部に次のメッセージで、ネストされたDependencyResolutionExceptionとInvalidOperationExceptionが数層: 「それは難しいですとコンテキストインターフェイスのコンテナの自己登録を有効にすべきではありませんLifetimeScopeクラスに-wired「

それがはるかにも明らかにしないスローAutofactコード - 。>https://github.com/autofac/Autofac/blob/d44e09d37863e13aa09eefa6f249caf1e5caf0f1/src/Autofac/Core/Container.cs

をどのような条件では、この例外が実際にスローされますか?

答えて

2

別スレッドで解決を行っているマルチスレッドのシナリオをお持ちの場合は、ライフタイムスコープの作成と処分について多くのロックを行う必要があります。その生涯の範囲から何かを解決しようとしている間に生涯のスコープを廃棄することは、あなたを問題の世界に導くことになります。その結果、たくさんの意味がない奇妙なメッセージが表示されます。これらの結果の実際にあなたは、このエラーに得ることができるすべての方法はおそらく1つ(またはそれ以上)につながる把握するために、コードをバック歩い

  • 多くの時間がかかるだろう。
  • あなたが見つけたものを解読するのは本当に混乱し、困難になるでしょう。
  • 解決策はロック、マルチスレッド、およびスコープの作成/廃棄に関して非常に注意するため、最終的には大したことではありません。一例として

、Autofacは親生涯スコープを配置すると、その親から生まれたされた任意の子スコープのない処分をしてしばらくの間、長時間実行されている問題がありました。私たちはそれを長い間修正していましたが、スコープの階層を追跡することで、リクエストごとに有効期間があるWebサイトのようなトラフィックが非常に簡単にメモリリークを引き起こすことが判明しました。あなたが生涯の範囲をスピンアップしているならば、それらを引き裂くことにも非常に責任があるはずなので、最終結果はwontfixでした。

大規模ではあるが、解決操作はコンストラクタとよく似ている。それらは非常に高速で、アトミックで、マルチスレッドを必要としないはずである。長い時間がかかる解決策を実行するためにワーカースレッドを生成する必要が生じたら、それは解決すべきアーキテクチャ上の問題です。

関連する問題