我有一个WPF应用程序。我有一个简单的UI和几个文本框。每个文本框都使用函数- Updatefirst(string msg)和updateSecond(string msg)进行更新
我有两个回调到我的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:
更新函数只包含消息更新:就像这样- txtCommand.Text = txtbox.text;它们不会调用除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;
}发布于 2016-06-30 01:58:59
最终,这意味着您的一个调用将执行代码,该代码将调用执行两个锁之一的回调(因此会产生死锁)。一旦你在你的第一个锁,只需步入和通过,直到你落地在第二个锁。
https://stackoverflow.com/questions/38106649
复制相似问题