Mam dość skomplikowaną aplikację WPF, która wydaje się "zawieszać" lub utknąć w wywołaniu Czekaj, próbując użyć dyspozytora do wywołania wywołania w wątku UI.Dyspozytor WPF. Wywołanie "zawieszania"
Ogólny proces jest:
- obsłużyć zdarzenia kliknij na przycisku
- Tworzenie nowego wątku (STA), który: tworzy nową instancję prezenter i interfejsu użytkownika, a następnie wywołuje metodę Disconnect
- Disconnect następnie ustawia właściwość na interfejsie o nazwie Nazwa
- setter dla Name następnie wykorzystuje poniższy kod, żeby ustawić właściwość:
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.
Moim problemem jest to, że gdy dyspozytor powołać wywoływana jest metoda wydaje się powiesić za każdym razem, a callstack wskazuje, że w jego śnie, czekać lub dołączyć w ramach realizacji Invoke.
Czy jest coś, co robię źle, czego mi brakuje, oczywiste czy nie, czy też istnieje lepszy sposób wywoływania do wątku interfejsu użytkownika, aby ustawić tę właściwość (i inne)?
Edit: Rozwiązaniem było zadzwonić System.Windows.Threading.Dispatcher.Run() na końcu delegata gwintu (np którym praca była wykonywana) - Dziękuję wszystkim, którzy pomogli.
@Matthew - właściwie nie ma nic "nieoptymalnego" w BeginInvoke; jeśli nie potrzebujesz absolutnie aktualizacji * teraz *, to jest w porządku. Musisz jednak zachować ostrożność przy przechwytywaniu zmiennych (tzn. Nie zmieniaj "wartości" po wywołaniu BeginInvoke) W ogóle.) –
@Matthew - nie przyłączasz się() do nowego wątku, prawda? To by to tłumaczyło ... –
@Marc Gravell - z pamięci W pewnym momencie dołączyłem do wątku, ale nie jestem pewien, czy zachowanie było takie samo, kiedy tego nie używałem. Powodem przyłączenia się jest to, że chciałem zablokować resztę aplikacji, dopóki praca się nie zakończy, ale może będę mógł skorzystać z alternatywy. –