2010-07-06 2 views
1

은 가정하자 나는이 같은 MEF 구성이 : 내가 본 문서에 따르면MEF 재구성 - 기존 인스턴스를 유지합니까?

public class Composition 
{ 
    [ImportMany(AllowRecomposition = true)] 
    IEnumerable<ILongRunningProcess> Processes { get; set; } 

    public static void Main(string[] args) 
    { 
     var composition = new Composition(); 
     using (var catalog = new DirectoryCatalog(".")) 
     { 
      using (var container = new CompositionContainer(catalog) 
      { 
       container.SatisfyImportsOnce(composition); 
       //Fire off long running processes in response to stimuli 
      } 
     } 
    } 
} 

을, 나는 "재구성을 사용할 때 스레드 안전성을 고려해야합니다."[MSDN]를위한 분명히

내가 유형을 제거한 경우, 장기 실행 프로세스가 가비지 수집이 안전하게 이루어질 수 있도록해야합니다. 그러나 재구성 전에 존재하고 재구성 후에 여전히 존재하는 유형의 경우 재구성이 발생할 때마다 Processes의 내용에 대한 새 인스턴스를 다시 가져 오거나 카탈로그 재구성시 기존의 인스턴스를 보존 할 수 있습니까? ICollection<T> 위해 MEF는 Clear()Add(T) 방법을 사용하는 위의 문서의 제안을 바탕으로

, 나는 희망 아니지만, 내가 동기화 코드를 작성 가기 전에 확실히 알고 싶습니다.

EDIT 나는 방금 정적 방법으로 this을 사용할 수 없다는 것을 알았습니다. 그에 따라 코드를 업데이트했습니다.

답변

0

내역이 ILongRunningProcess 인 유형에 부품 생성 정책이 비공유로 설정되어 있지 않으면 동일한 인스턴스가 반환됩니다.

이것은 실제로 스레드 안전 문제가 아닙니다. 재구성이 발생하면 MEF 컨테이너 (MEF가 제공하는 Lazy의 Value 속성에 액세스하는 것과 같은 것을 포함)에 액세스하는 것이 아무것도 없는지 확인하려고합니다. 따라서 장시간 실행되는 프로세스가 다른 스레드에서 실행 중이고 고유 한 가져 오기가있는 경우 스레딩 문제가 발생할 수 있습니다.

+0

"스레드 세이프 (thread-safe)"라는 용어는 이러한 프로세스를 결정 론적으로 중지시켜 다음 인스턴스에서 해당 프로세스를 다시 시작할 수있는 방법을 제공하고자합니다. 카탈로그가 변경 될 때 실행되는 수에는 제한이 없으며 해당 작업을 "재개 가능"해야합니다. 고전적인 정의에 맞지 않는다고 생각합니다. 나는 더 나은 질문 제목을 생각해 내도록 노력할 것이다. – arootbeer