2016-06-29 2 views
0

WPF 앱이 있습니다. 몇 개의 텍스트 상자가있는 간단한 UI가 있습니다. 각 텍스트 상자는 UpdateFirst (문자열 msg) 및 updateSecond (문자열 msg) 함수를 사용하여 업데이트됩니다.2 콜백 함수에서 WPF UI 업데이트 데드락

내 UI에 콜백하는 스레드가 2 개 있습니다.

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

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

나는 속도에 제어 할 수 없습니다 : 나는 두 텍스트 상자를 업데이트 할 내가 같이 그것을 - 각 콜백 내가 데이터 처리를 완료하면 데이터와 함께 제공 앞으로 올 콜백. 그래서 1 초 안에 5 ~ 10 콜백을받을 수 있습니다. 대부분의 경우 모든 것이 작동하지만 때로는 교착 상태가 발생합니다. 하나의 프로세스가 Dispacher.Invoke 내에 고정되어 있고 다른 프로세스는 잠금 라인에 고정되어 있습니다.

내가 뭘 잘못하고 있니?

는 *** UPDATE 1 :

업데이트 기능 만 업데이트 txtbox.text 포함 :이 같은 - txtCommand.Text = 메시지를; txtBox.text = "staff"이외에는 다른 작업을 수행하지 않습니다.

** 업데이트 2 : Invoke 대신 BeginInvoke를 사용하면 데드락이 훨씬 더 멀리 나타나지만 결국에는 다시 충돌합니다.

는 ** 업데이트 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 이벤트를 트리거 한 다음 텍스트 상자 2의 텍스트를 설정하고 해당 이벤트를 반복적으로 트리거하는 루프에 있다는 것입니다. –

+0

질문 업데이트 기능 업데이트 그냥 텍스트 상자. – Dani

+0

이 코드는 어디에서 호출됩니까? TextChanged 이벤트 핸들러가 있습니까? –

답변

1

는 궁극적으로이 당신의를 불러옵니다 중 하나가 두 개의 잠금 장치 (따라서 교착 상태를 만드는) 중 하나를 실행하는 콜백을 호출하는 코드를 실행하는 것을 의미한다. 첫 번째 자물쇠에 일단 들어가면 두 번째 자물쇠에 착륙 할 때까지 들어갈 수 있습니다.

+0

그렇지 않습니다. 그들은 모두 ui의 텍스트 상자를 업데이트합니다. (txtItem.text = "staff". – Dani

+0

잘 자물쇠는 객체에 대한 액세스를 차단하지 않으며, 다른 잠금이 진행되지 못하도록합니다. 따라서 a) 다른 것에서 다른 작업 첫 번째 스레드가 첫 번째 스레드와 함께 실행을 완료하지 못하게하는 thread - 또는 - b) 잠금을 호출하는 코드 내에서 잠금을 호출하는 재귀 호출이 있습니다. 그것들은 유일하게 두 가지 논리적 가능성이다. – noone392

+0

잠금 내에서 실행되는 함수는 UI를 업데이트하고 리턴한다. 다른 코드를 호출하지 않습니다. – Dani

관련 문제