调用线程无法访问此对象,因为另一个线程拥有它

时间:2013-06-24 09:19:43

标签: c# wpf

我遇到线程问题,我想在收到短信时在txtoutput(文本框)上显示一个文字我已经完成了但是没有用。

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 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分:2)

您正在以正确的方式设置txtOutput的文字(CheckAccess()BeginInvoke)。对expander执行相同的操作。