从两个回调函数更新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;
}

从两个回调函数更新WPF UI时遇到死锁

最终,这意味着其中一个调用调用执行两个锁之一的回调的代码(从而创建死锁)。一旦你进入了第一个锁,就直接进入并穿过,直到你到达第二个锁。