2011-02-02 2 views
2

나는이 문제를 잠시 동안 알아 내려고 노력해 왔으며 지금 당황 스럽다. 백그라운드 스레드에서 생성 및 직렬화하려고하는 UserControl 유형 (아래 편집)을 작성했습니다.두 스레드간에 리소스가 포함 된 UserControl을 올바르게 전달하는 방법은 무엇입니까?

컨트롤을 생성하는 백그라운드 스레드는 STA로 표시되고 메모리 스트림을 사용하여 컨트롤을 전달합니다. 그러나 컨트롤에는 deserialization 중에 오류를 일으키는 UserControl.Resources 섹션의 데이터 템플릿이 포함되어 있습니다.

외부 병합 된 리소스 사전의 리소스를 정의하지 않고 스레드간에 리소스를 포함하는 사용자 정의 컨트롤을 전달할 수 있습니까?

번호 : UserControl을 (단일 스레드로 표시)

<UserControl x:Class="WPF_Base.Example"> 
<UserControl.Resources> 
    <DataTemplate DataType={x:Type Example2}> 
    <Example2View /> 
    </DataTemplate> 
</UserControl.Resources> 
<Grid> 
    <StackPanel> 
    <ItemsControl ItemSource="{Binding GetExamples}" /> 
    </StackPanel> 
</Grid> 
</UserControl> 

ThreadCode :

  System.IO.MemoryStream streamer = new System.IO.MemoryStream(); 

      var testExample = new WPF_Base.Example(); 
      var test = System.Windows.Markup.XamlWriter.Save(testExample); 

      var test2 = new System.IO.StringReader(test); 
      var test3 = System.Xml.XmlReader.Create(test2); 
      var test4 = (WPF_Base.TestExample)System.Windows.Markup.XamlReader.Load(test3); //Exception thrown here about key already existing in the dictionary 

EDIT : 컨트롤이 생성되고 인해위한 다른 스레드에 내장되고 해당 사용자가 각각 화면의 뷰로 표시되는 많은 데이터 조각 (컨트롤이 MVVM 패턴으로 있음)을 포함하는 파일을로드하고있는 것일 수 있습니다. 이 과정에서 나는 여전히 UI가 응답 성이 좋고 "잠그는"것처럼 보이기를 원할 것입니다. 컨트롤이 스크린 대신에 렌더링 될 때마다 비틀 거리는 것 같아요. 뷰가있는 주요 병목 일 것이기 때문입니다.

+0

MVVM에서 컨트롤에서 데이터를 분리합니다. 내 편집 된 답변보기 –

+0

데이터와 컨트롤이 분리됩니다. 문제는 모든 컨트롤을 한 번에 렌더링하는 것 같습니다. 배경 스레드에서 생성 할 때까지 표시되지 않기 때문에 수정되지 않는다는 것을 알았습니다. – JMcCarty

답변

0

EDIT : 실제로 MVVM 패턴을 사용하는 경우 기본 (UI) 스레드에서 컨트롤을 만들고 다른 스레드에서 개체 데이터를 만들고 사용할 수있는 경우 컨트롤의 DataContext로 설정해야합니다. 더 나은 아직 각 'DataContext'사용할 때까지 컨트롤을 전혀 만들지 마십시오. 이는 인터넷을 통해 오랜 시간 동안 데이터를 기다려야하는 경우에도 응용 프로그램의 반응을 유지하는 일반적인 방법입니다.

OLD -> 질문의 첫 번째 부분에 대해 : 이것은 스레드 문제가 아닙니다. 즉, 데이터를 비 직렬화 할 때 런타임에서 템플릿의 내부 'XAMLType'표현에 객체를 다시 추가하려고하기 때문에 이것이 작동하지 않습니다. 그러나이 효과는 템플리트에만 국한되지 않고 사용자가 정의한 모든 자원은이 방식으로로드하려고 시도 할 때 문제점을 유발합니다. 심지어 컨트롤에있는 XAML 요소에 이름 등을 부여해도 문제가 발생할 수 있습니다.

편집 : 사용하려는 XAML serializer 방식이 의도 한 것이 아닙니다. 또한 주석에 언급 된 이유로 다른 스레드에서 컨트롤을 만들고 싶지 않습니다.

+0

개체 참조를 전달할 때의 문제는 주 스레드가 생성 된 컨트롤을 사용하려고 할 때 예외가 발생한다는 것입니다. 단, 컨트롤을 만든 스레드 만 사용할 수 있습니다. – JMcCarty

관련 문제