2011-11-13 3 views
1

다음 WPF 코드가 있고 "TextBox t = tabItem.Content TextBox;"예외가 발생합니다. 오류가 "다른 스레드가 소유하고 있기 때문에 호출하는 스레드는이 개체에 액세스 할 수 없습니다."라는 메시지가 나타납니다. 예외를 수정하려면 어떻게해야합니까?"호출 스레드가 다른 스레드가 소유하고 있기 때문에이 개체에 액세스 할 수 없습니다."해결 방법 WPF 응용 프로그램에서

감사합니다.

private void btnAdd_Click(object sender, RoutedEventArgs e) 
{ 
    RichTextBox statusRichTextBox = new RichTextBox(); 
    CloseableTabItem tabItem = new CloseableTabItem(); 
    tabItem.Content = statusRichTextBox; 
    tabItem.Header = "New Tab"; 
    MainTab.Items.Add(tabItem); 
    Thread t = new Thread(new ParameterizedThreadStart(worker)); 
    t.Start(tabItem); 
} 


public void worker(object threadParam) 
{ 
    CloseableTabItem tabItem = (CloseableTabItem)threadParam; 

    TextBox t = tabItem.Content as TextBox; //exception here 
    if (t != null) 
    Window1.myWindow1.Dispatcher.BeginInvoke((Action)(() => { t.Text = "THIS IS THE TEXT"; }), System.Windows.Threading.DispatcherPriority.Normal); 
} 
+1

같은 방법으로 사람들이 그것을 해결. 중복 된 타이틀 오류가 발생하지 않았습니까? 나중에 변경 했습니까? 어느 쪽이든, 오른쪽에 보이는 "관련"-> –

+1

확실히 ** 길 ** 너무 많습니다. –

+0

@ H.B. - 당신은 충분한 대리인이 있고, 하나를 골라 닫으십시오. – Kev

답변

3

속성 및 UI 객체의 방법은 이러한 개체를 만든 스레드에 액세스 할 수 있습니다, 그래서 당신은 작업자 스레드에 tabItem.Content에 액세스하려고하면 실패합니다.

대신 그 작업을 수행 할 수 있습니다 것을 제외하고는 그 다른 질문에

TextBox t; 
Window1.myWindow1.Dispatcher.Invoke(new Action(() => t = tabItem.Content as TextBox)); 
+0

답변을 주셔서 감사하지만 여전히 RichTextBox에 텍스트를 쓸 수 없습니다. 저도 그 코드를 보여 주시겠습니까? – Arya

+0

@Arya, TabItem의 내용이 RichTextBox이고 TextBox로 캐스팅했기 때문입니다. RichTextBox는 TextBox의 하위 클래스가 아니므로 'tabItem.Content as TextBox'는 null을 반환합니다. –

+0

여기에 코드를 넣었습니다. http://pastebin.com/wDmQjvTd하지만 이제는 t가 할당되지 않은 지역 변수입니다. 죄송합니다.이 Dispatcher와 스레딩 물건을 처음 접해 보았습니다. – Arya

관련 문제