2017-09-28 9 views
0

"세션"당 별도의 LifetimeScope와 작업자 스레드의 장기 실행 해결과 관련된 시나리오가 있습니다. 타이밍에 문제가있을 수있는 오류가 발생했습니다. 실제 해상도가 끝나기 전에 수명 범위가 삭제/생성 될 때 발생합니다.간헐적 LifetimeScope 오류 : SelfRegistrationCannotBeActivated

나는 예외가 조금 애매하기 때문에 가지 단서입니다 - 하단에 다음과 같은 메시지와 중첩 된 DependencyResolutionException 및 InvalidOperationException이 몇 층 : 그것은 어렵다으로 은 "상황에 맞는 인터페이스의 컨테이너의 자체 등록이 활성화되지 말아야 .이 예외가 실제로 발생합니다 어떤 조건에서>https://github.com/autofac/Autofac/blob/d44e09d37863e13aa09eefa6f249caf1e5caf0f1/src/Autofac/Core/Container.cs

- LifetimeScope 클래스 "

훨씬뿐만 아니라 공개하지 않는 던져 Autofact 코드로 - 유선?

답변

2

만약 당신이 별도의 스레드 (당신이 묘사 한 것입니다)에서 해상도를 수행하는 다중 스레드 시나리오를 가지고 있다면 평생 범위 생성 및 폐기에 대해 많은 잠금을 수행해야 할 것입니다. 평생 범위에서 뭔가를 해결하려고 노력하는 동안 평생 범위를 폐기하면 문제가 생길 수 있습니다. 그 결과, 많은 의미를 갖지 않는 이상한 메시지가 나타납니다.

사실 가능성이 결과 중 하나 (또는 ​​그 이상)으로 이어질 것입니다 당신이 오류를 얻을 수있는 모든 방법을 알아 내기 위해 다시 코드를 통해 도보 :

  • 시간이 많이 걸릴 거예요.
  • 당신이 발견 한 것을 해독하는 것은 정말로 혼란스럽고 어렵게 될 것입니다.
  • 결국 솔루션은 잠금, 멀티 스레딩 및 범위 생성/폐기에 대해 매우주의해야하기 때문에 결국에는별로 중요하지 않습니다.

는 예를 들면, Autofac 부모 수명 범위를 폐기 할 경우 잠시 동안 장기 실행 문제가 있었다 그 부모로부터 산란 된 하위 범위의하지 처분을한다. 우리는 오랫동안 그 문제를 해결하기 위해 노력했지만, 요청의 수명 범위가있는 웹 사이트와 같이 트래픽이 많은 곳에서 메모리 누수가 발생하기 쉽도록 범위의 계층 구조를 추적하는 것으로 밝혀졌습니다. 평생 스코프를 돌리고 있다면, 찢어짐에 대한 책임 또한 져야하므로 최종 결과는 wontfix입니다.

크기가 클수록 해결 작업은 생성자와 매우 유사합니다. 즉, 매우 빠르고 원자 적이어야하며 멀티 스레딩이 필요하지 않습니다. 오랜 시간이 걸리는 해결 작업을 수행하기 위해 작업자 스레드를 생성해야하는 경우에는 해결해야 할 아키텍처 문제입니다.