UI 스레드에서 호출을 호출하기 위해 디스패처를 사용하려고 할 때 '걸려있는'것처럼 보이거나 대기 호출에서 멈추는 다소 복잡한 WPF 응용 프로그램이 있습니다.WPF Dispatcher.Invoke 'hanging'
일반적인 절차는 다음
- 는
- 새로운 스레드 (STA) 만들기 버튼 클릭 이벤트를 처리 : 발표자 및 UI의 새로운 인스턴스를 생성을, 방법 끊기 호출 :
- 분리 다음 UI의 속성이 이름을
- 이름에 대한 세터 다음 속성을 설정하려면 다음 코드를 사용합니다라는 설정
if(this.Dispatcher.Thread != Thread.CurrentThread)
{
this.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate{
this.Name = value; // Call same setter, but on the UI thread
});
return;
}
SetValue(nameProperty, value); // I have also tried a member variable and setting the textbox.text property directly.
내 문제는 발송자가 메서드를 호출 호출 할 때마다 한 시간을 걸어 것 같다, 그리고 호출 스택은 수면에, 기다리거나 호출 구현 이내에 가입을 나타냅니다.
그래서 내가 놓친 부분이 분명하지 않습니까? 아니면이 속성 (및 기타)을 설정하기 위해 UI 스레드를 호출하는 더 좋은 방법이 있습니까?
편집 : 솔루션 (예를 들어 작업이 수행되고 있던 곳) 스레드 대표의 끝에서() System.Windows.Threading.Dispatcher.Run 전화를했다 - 도와 준 모두에게 감사합니다.
@Matthew - 사실, BeginInvoke에 대해서는 "최적이 아닌"것이 없습니다. 당신이 절대적으로 업데이트 *를 필요로하지 않는다면, 괜찮습니다. 하지만 캡쳐 된 변수에 대해서는 약간주의해야합니다 (BeginInvoke를 호출 한 후 "value"를 변경하지 마십시오.) –
@Matthew - 새 스레드를 조인 (join)하지 않습니까? 그걸 설명 할거야 ... –
@Marc Gravell - 메모리에서 나는 어떤 시점에서 스레드에 합류하고 있었지만, 그 동작을 사용하지 않을 때 같은 동작인지 잘 모르겠습니다. 참여의 이유는 작업이 완료 될 때까지 나머지 응용 프로그램을 차단하고 싶었지만 어쩌면 대안을 사용할 수 있습니다. –