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;
}
UpdateFirst 및 updateSecond 메서드의 코드를 표시 할 수 있습니까? 내 첫 번째 추측은 사용자가 textbox1을 입력하고 Changed 이벤트를 트리거 한 다음 텍스트 상자 2의 텍스트를 설정하고 해당 이벤트를 반복적으로 트리거하는 루프에 있다는 것입니다. –
질문 업데이트 기능 업데이트 그냥 텍스트 상자. – Dani
이 코드는 어디에서 호출됩니까? TextChanged 이벤트 핸들러가 있습니까? –