从两个回调函数更新WPF UI时遇到死锁
本文关键字:WPF 更新 UI 死锁 遇到 函数 回调 两个 | 更新日期: 2023-09-27 17:53:05
我有一个WPF应用程序。我有一个简单的UI与几个文本框。每个文本框使用一个函数更新- Updatefirst(字符串msg)和updatesecsecond(字符串msg)
我有两个线程回调到我的UI。每个回调都带有数据一旦我完成处理数据-我想更新两个文本框,我这样做:
lock (updatescreenlock)
{
Dispatcher.Invoke(new UpdatefirstCallBack(this.Updatefirst), Log.ToString());
}
和
lock (updatescreenlock)
{
Dispatcher.Invoke(new updateSecondCallback(this.updateSecond), str);
}
我无法控制那些回调的速率。所以我可以在一秒钟内得到多达5-10个回调。大多数时候一切正常,但有时会出现僵局。一个进程卡在dispatcher中。Invoke和其他人卡在了锁线上。
我在这里做错了什么?
*** UPDATE 1:
Update函数只包含txtbox。文本更新:像这样- txtCommand。文本=消息;除了txtBox,它们不会调用其他任何方法。Text = "staff".
** UPDATE 2:使用BeginInvoke而不是Invoke使死锁看起来更遥远,但最终我又击中了它。
**更新3:更新函数代码:
private void UpdateFirst(string message)
{
txtTimer.Text = myTime.ToString();
txt1.Text = val1.ToString();
txt2.Text = val2.ToString();
txt3.Text = val3.ToString();
txt4.Text = val4.ToString();
txt5.Text = val5.ToString();
txt1.Text = val6.ToString();
//if (message.Length > 0)
AddLogText(message);
}
private void AddLogText(string message)
{
string tmp = txtResults.Text;
txtResults.Text = DateTime.Now.ToLongTimeString() + "'n" + message + "'n" + tmp;
}
最终,这意味着其中一个调用调用执行两个锁之一的回调的代码(从而创建死锁)。一旦你进入了第一个锁,就直接进入并穿过,直到你到达第二个锁。