2016-06-29 69 views
0

我有一個WPF應用程序。 我有一個簡單的用戶界面與幾個文本框。 每個文本框更新使用函數 - Updatefirst(字符串味精)和updateSecond(字符串味精)從2個回調函數更新WPF UI的死鎖

我有2個線程,回調到我的用戶界面。 每個回調帶有數據 一次我處理完的數據 - 我想更新這兩個文本框,我不喜歡這樣寫道:

lock (updatescreenlock) 
{ 
Dispatcher.Invoke(new UpdatefirstCallBack(this.Updatefirst), Log.ToString()); 
} 

lock (updatescreenlock) 
{ 
    Dispatcher.Invoke(new updateSecondCallback(this.updateSecond), str); 
} 

我對速度沒有控制那些回調來的。 ,所以我可以在一秒鐘內得到5-10個回調。大多數情況下一切正常,但有時我會陷入僵局。 一個進程卡在Dispacher.Invoke中,其他進程卡在鎖定線中。

我在這裏做錯了什麼?

*** UPDATE 1:

的更新功能只包含txtbox.text更新: 這樣的 - txtCommand.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; 
} 
+1

你可以顯示你的Updatefirst和updateSecond方法的代碼嗎?我的第一個猜測是,你在一個循環中用戶輸入textbox1並觸發Changed事件,然後設置textbox2的文本並遞歸觸發其事件。 –

+0

更新了更新函數只是更新文本框的問題。 – Dani

+0

此代碼被調用的地方是什麼?你有一個TextChanged事件處理程序嗎? –

回答

1

最終,這意味着你調用一個執行調用執行兩個鎖(因此造成死鎖)的一個回調代碼。一旦你進入你的第一把鎖,就直接進入,直到你登上第二把鎖。

+0

事實並非如此。他們所做的只是更新UI上的文本框(txtItem.text =「staff」) – Dani

+0

好的鎖並不會阻止訪問對象,他們所做的只是防止另一個鎖繼續進行,因此要麼 a)使用第一個鎖停止第一個線程完成執行的線程, - 或- b)您有某種遞歸正在調用鎖的代碼中調用鎖。這些是唯一的兩個邏輯可能性 – noone392

+0

在鎖內運行的函數只是更新UI並返回。它不會調用任何其他代碼。 – Dani