从2个回调函数中更新WPF UI的死锁

时间:2016-06-29 17:41:44

标签: c# wpf multithreading locking deadlock

我有一个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;
}

1 个答案:

答案 0 :(得分:1)

最终,这意味着您的一个Invokes执行调用执行两个锁之一的回调的代码(从而产生死锁)。一旦你进入第一把锁,就进入第二把锁。