首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从2个回调函数中命中死锁更新WPF UI

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

Stack Overflow用户
提问于 2016-06-30 01:41:44
回答 1查看 188关注 0票数 0

我有一个WPF应用程序。我有一个简单的UI和几个文本框。每个文本框都使用函数- Updatefirst(string msg)和updateSecond(string msg)进行更新

我有两个回调到我的UI的线程。每次回调都会在我处理完数据后提供数据--我想要更新两个文本框,我这样做:

代码语言:javascript
复制
 lock (updatescreenlock)
{
 Dispatcher.Invoke(new UpdatefirstCallBack(this.Updatefirst), Log.ToString());
} 

代码语言:javascript
复制
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:更新函数代码:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2016-06-30 01:58:59

最终,这意味着您的一个调用将执行代码,该代码将调用执行两个锁之一的回调(因此会产生死锁)。一旦你在你的第一个锁,只需步入和通过,直到你落地在第二个锁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38106649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档