2013-03-14 3 views
0

Dispatcher를 사용하여 작업자 스레드에서 WPF 텍스트 블록에 일부 내용을 추가하려고 다른 질문을 시도했습니다. XAML와InvalidOperationException TextBlock 업데이트

private void AppendLineToChatBox(Inline message) 
{   
    chatBox.Dispatcher.BeginInvoke(new Action(() => 
    { 
     chatBox.Inlines.Add(message); 
     chatBox.Inlines.Add("\n"); 
     scroller.ScrollToBottom(); 
    })); 
} 

: 나는 다음과 같은 방법을 사용하고

<Grid Height="200" Width="300" HorizontalAlignment="Left"> 
    <ScrollViewer Name ="scroller"> 
     <TextBlock TextWrapping="Wrap" Background="White" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Name="chatBox" /> 
    </ScrollViewer> 
</Grid> 

나는 여전히 다음과 같은 예외가 무엇입니까 백그라운드 스레드에서() AppendLineToChatBox를 호출 할 때 :

시스템. InvalidOperationException 처리되지 않은 HResult = -2146233079
메시지 = 다른 스레드가 소유하고 있기 때문에 호출하는 스레드가이 개체에 액세스 할 수 없습니다. 그것.

정확한 방법을 높이 평가할 수 있습니다.

+1

하는 줄에 현재 예외를받을 수 있나요? 'scroller.ScrollToBottom()'에 관한 것이 아닌가? – maximpa

+0

chatBox.Inlines.Add (메시지) – CanCan

+0

에 의해 예외가 발생했습니다. 이미 디스패처를 사용하고있어 중복 질문이라고 생각하지 않습니다. – CanCan

답변

1

Inline 클래스는 DispatcherObject에서 상속합니다. 즉,이 클래스에서 만들어진 모든 객체는 해당 객체가 만들어지는 스레드에 연결됩니다. 코드를 살펴보면 AppendLineToChatBox 메서드가 작업자 스레드에 의해 호출되고 작업자 스레드가 Inline 개체도 소유하는 것처럼 보입니다.

이 문제를 해결하기 위해, 당신은 UI 스레드에서 인라인 개체를 생성해야합니다 (예를 들어, BeginInvoke의 코드 블록)

+0

답변 해 주셔서 감사합니다. – CanCan

관련 문제