Robią dwa bardzo różne rzeczy:
Task.Factory.StartNew
harmonogramy delegatem do realizacji na basenie wątku gwintu. Bieżący wątek nadal działa bez oczekiwania na wynik tego zadania (asynchronizacja). Zwykle tworzysz dłużej działające zadanie w tle, aby interfejs nie był blokowany zbyt długo (nie "zamrożony").
Dispatcher.BeginInvoke
planuje delegata do wykonania na wątku wysyłającego (UI). Zwykle robi się to, aby zaktualizować niektóre formanty UI z wynikami niektórych operacji, które zostały wykonane na wątku tła w postaci . Zasadniczo aktualizujesz tutaj interfejs użytkownika.
Aby odpowiedzieć ci na pytania bezpośrednio:
Nie należy planować długich operacji na dyspozytora wątku, zwykle chcesz tylko zaktualizować tutaj formantów UI. Kod w delegacie zostanie wykonany na wątku UI, który jest blokowany na czas wykonania. Wystarczy wpisać Thread.Sleep(10000)
w swoim bieżącym kodzie (który planujesz od konstruktora), a zobaczysz, że interfejs użytkownika zamrozi. Użyj do tego zadania w tle - albo z Task
lub z robotem działającym w tle (obie będą używać wątku puli wątków).
A może to lepiej użyć Task.Factory.StartNew a następnie wysyłając rzeczy z powrotem na interfejsie, dzięki czemu aplikacja załaduje pierwszy niezależnie od czas procesu ładowania treści.
Tak!
Dzięki za odpowiedź, zostanie Dispatcher.BeginInvoke zablokować interfejs użytkownika ... w mojej aplikacji. muszę wywołać niektóre usługi podczas ładowania i jeśli usługa jest zatrzymana, zawiesza się interfejs użytkownika, mimo że użyłem Dispatcher.BeginInvoke, więc moim podstawowym pytaniem jest użycie dispatchera lub Task w tym przypadku? –
jeśli chcesz, aby coś działało na * tle * użyj zadania, jeśli chcesz wysłać wyniki do interfejsu użytkownika, użyj 'Dispatcher.BeginInvoke' – BrokenGlass