我有一个WPF应用程序。 我有一个带有几个文本框的简单UI。 每个文本框都使用函数更新 - Updatefirst(string msg)和updateSecond(string msg)
我有2个回调到我的UI的线程。 每个回调都带有数据 一旦我完成数据处理 - 我想更新两个文本框,我这样做:
lock (updatescreenlock)
{
Dispatcher.Invoke(new UpdatefirstCallBack(this.Updatefirst), Log.ToString());
}
和
lock (updatescreenlock)
{
Dispatcher.Invoke(new updateSecondCallback(this.updateSecond), str);
}
我无法控制回调率。 所以我可以在一秒钟内获得5-10个回调。 大部分时间一切正常,但有时我会陷入僵局。 一个进程卡在Dispacher.Invoke中,其他进程卡在锁定线中。
我在这里做错了什么?
***更新1:
Update函数只包含txtbox.text更新: 像这样--txtCommand.Text = message; 除了txtBox.text =“staff”之外,他们不会调用任何其他方法。
**更新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;
}
答案 0 :(得分:1)
最终,这意味着您的一个Invokes执行调用执行两个锁之一的回调的代码(从而产生死锁)。一旦你进入第一把锁,就进入第二把锁。