Czy istnieje „standardowy” sposób określania, że kontynuacja zadania powinna być uruchamiana w wątku, z którego zostało utworzone zadanie początkowe?
Obecnie mam poniższy kod - działa, ale śledzenie dyspozytora i utworzenie drugiej Akcji wydaje się niepotrzebnym narzutem.
dispatcher = Dispatcher.CurrentDispatcher;
Task task = Task.Factory.StartNew(() =>
{
DoLongRunningWork();
});
Task UITask= task.ContinueWith(() =>
{
dispatcher.Invoke(new Action(() =>
{
this.TextBlock1.Text = "Complete";
}
});
Control.Invoke(Action)
, tj.TextBlock1.Invoke
zamiastdispatcher.Invoke
Odpowiedzi:
Zadzwoń do kontynuacji za pomocą
TaskScheduler.FromCurrentSynchronizationContext()
:Jest to odpowiednie tylko wtedy, gdy bieżący kontekst wykonania znajduje się w wątku interfejsu użytkownika.
źródło
await
jest dobrym wzorcem - ale tylko jeśli znajdujesz się wasync
kontekście (takim jak zadeklarowana metodaasync
). Jeśli nie, nadal trzeba zrobić coś takiego.Dzięki asynchronizacji po prostu wykonujesz:
Jednak:
źródło
false
wersją myli mnie. Pomyślałem, żefalse
oznacza to, że może kontynuować na innym wątku.async
metody (której użycie jest konieczneawait
). Jaka jest odpowiedź, kiedyawait
nie jest dostępna?Jeśli masz wartość zwracaną, którą musisz wysłać do interfejsu użytkownika, możesz użyć wersji ogólnej takiej jak ta:
W moim przypadku jest to wywoływane z MVVM ViewModel.
źródło
Chciałem tylko dodać tę wersję, ponieważ jest to tak przydatny wątek i myślę, że jest to bardzo prosta implementacja. Użyłem tego wiele razy w różnych typach, jeśli aplikacja wielowątkowa:
źródło
TaskScheduler
jest częścią BCL,Dispatcher
nie jest) i może być używany do komponowania złożonych łańcuchów zadań, ponieważ nie trzeba się martwić o operacje asynchroniczne typu „odpal i zapomnij” (np.BeginInvoke
).Dostałem się tutaj przez Google, ponieważ szukałem dobrego sposobu na zrobienie czegoś w wątku interfejsu użytkownika po wejściu do wywołania Task.Run - używając następującego kodu, którego możesz użyć,
await
aby wrócić do wątku interfejsu użytkownika.Mam nadzieję, że to komuś pomoże.
Stosowanie:
źródło
static
klasyUI
.