2013-06-24 2 views
0

У меня проблема с потоком, я хочу отобразить текст на своем txtoutput (текстовое поле), когда получаю SMS-сообщение, которое я сделал, но не работает ,Вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток

private void Output(string text) 
{ 
    this.expander.IsExpanded = true; // Exception catched: The calling thread can not access this object because a different thread owns it. 

    if (txtOutput.Dispatcher.CheckAccess()) 
    { 
     txtOutput.AppendText(text); 
     txtOutput.AppendText("\r\n"); 
    } 
    else 
    { 
     this.txtOutput.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate 
     { 
      // txtOutput.AppendText += text Environment.NewLine; 
      txtOutput.AppendText(text); 
      txtOutput.AppendText("\r\n"); 
     }); 
    } 
} 

ответ

2

попробовать это вместо

private void Output(string text) 
{ 
    if (txtOutput.Dispatcher.CheckAccess()) 
    { 
     this.expander.IsExpanded = true; 
     txtOutput.AppendText(text); 
     txtOutput.AppendText("\r\n"); 
    } 
    else 
    { 
     this.txtOutput.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate 
     { 
      this.expander.IsExpanded = true; 
      // txtOutput.AppendText += text Environment.NewLine; 
      txtOutput.AppendText(text); 
      txtOutput.AppendText("\r\n"); 
     }); 
    } 
} 

Улучшенная версия:

private void Output(string text) 
{ 
    if (!txtOutput.Dispatcher.CheckAccess()) 
    { 
     this.txtOutput.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate 
     { 
      Output(text); //Call this function again on the correct thread! 
     }); 
     return; 
    } 
    this.expander.IsExpanded = true; 
    txtOutput.AppendText(text); 
    txtOutput.AppendText("\r\n"); 
} 
+0

thanks; это сработало, но мой разум не делает, почему я устанавливаю расширитель неправильно? – tp1

+0

Я понятия не имею, что такое расширитель, но я предполагаю, что это какой-то контроль? и вы пытаетесь изменить элемент управления в неправильном потоке, вы получаете исключение, поэтому вы должны использовать диспетчер. – Peter

2

Вы устанавливаете текст txtOutput в правильном пути (CheckAccess() и BeginInvoke). Сделайте то же самое с expander.

Смежные вопросы

 Смежные вопросы