2012-04-20 3 views
1

다른 스레드에서 윈도우의 배경을 변경하고 싶습니다. 두 개의 프로그램이 있는데 하나는 작업 권한이고 다른 하나는 InvalidOperationException을 던집니다.다른 스레드에 의해 생성 된 객체 사용

오른쪽 코드 :

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     Thread t = new Thread(new ParameterizedThreadStart(threadTest)); 
     t.Start(@"C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"); 
    } 

    void threadTest(object obj) 
    { 
     string path = obj as string; 
     this.Dispatcher.Invoke(new Func<object>(() => this.Background = new 
    } 
} 

오류 코드 :이 코드 사이

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     Thread t = new Thread(new ParameterizedThreadStart(threadTest)); 
     t.Start(@"C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"); 
    } 

    void threadTest(object obj) 
    { 
     string path = obj as string; 
     //this.Dispatcher.Invoke(new Func<object>(() => this.Background = new ImageBrush(new BitmapImage(new Uri(path))))); 
     ImageBrush background = new ImageBrush(new BitmapImage(new Uri(path))); 
     this.Dispatcher.Invoke(new Func<object>(() => this.Background = background)); 
    } 
} 

다른 오류 코드가 자식 스레드에서 ImageBrush와 개체를 만들 수 있다는 것입니다. 그래서 내 질문은 : wpf 프로그램에서 스레드가 자신의 스레드에 의해 생성 된 개체를 사용할 수 있습니다? 어떤 답장을 보내 주셔서 감사합니다 .

답변

1

네, 맞습니다. UI 스레드 만이 작성한 객체를 사용할 수 있습니다. 따라서 Dispatcher를 사용하여 적절한 스레드에서 UI 작업을 "대기열에 넣을"수 있습니다.

두 번째 질문에 답하면 확실하게 UI 스레드에 객체를 "전달"할 수있는 방법이 있습니다. 당신이 (디스패처에) BeginInvoke의 구조를 볼 경우는 다음과 같습니다 당신이 PARAMS을 어디다

인수가 params 객체 배열이
public DispatcherOperation BeginInvoke(
    Delegate d, 
    params Object[] args 
) 

가있다.

Freezable 개체 (예 : 일부 이미지, 브러시, 변환 또는 기하학)를 사용하는 경우 object.Freeze();을 UI 스레드로 보내기 전에이 작업을 수행해야합니다.

+0

UI 스레드가 자체적으로 만든 개체 만 사용할 수있는 경우 다른 스레드가 개체를지나 UI 스레드로 보내도록하는 방법이 있습니까? – adream307

+0

@ adream307 확실합니다, 제 편집 참조 :) –

0

예, 정확합니다. 약 WPF 일뿐 아니라 일반적으로 약 Windows programming입니다.

UI 개체를 다른 스레드에서 업데이트 할 수 없습니다.

이유는 메시지 펌핑, 특히 OS의 대상 제어로의 전달이 보장되어야하기 때문입니다. 이것은 물론 SendMesage을 사용하는 통신에서는 유효하지만 PostMessage의 경우에도 유효합니다.

0

별도의 스레드에서 개체를 만드는 경우 먼저 동결하면 GUI 스레드에서 사용할 수 있습니다. Freezable objects을 참조하십시오.

관련 문제