调用线程无法访问此对象,因为其他线程拥有它
本文关键字:线程 因为 其他 拥有 访问 调用 对象 | 更新日期: 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");
}