调用线程无法访问此对象,因为其他线程拥有它

本文关键字:线程 因为 其他 拥有 访问 调用 对象 | 更新日期: 2023-09-27 18:19:35

我的线程有问题,当我收到短信时,我想在我的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");
         }); 
    }
}

调用线程无法访问此对象,因为其他线程拥有它

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

尝试使用

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");
}
相关文章: