Początkowo myślałem, że wszystkie kontynuacje są wykonywane na wątku (biorąc pod uwagę domyślny kontekst synchronizacji). To jednak nie wydaje się być, gdy używam TaskCompletionSource
.W takim przypadku TaskCompletionSource.SetResult() uruchamiać kontynuację synchronicznie?
Mój kod wygląda mniej więcej tak:
Task<int> Foo() {
_tcs = new TaskCompletionSource<int>();
return _tcs.Task;
}
async void Bar() {
Console.WriteLine(Thread.Current.ManagedThreadId);
Console.WriteLine($"{Thread.Current.ManagedThreadId} - {await Foo()}");
}
Bar
jest wywoływana na konkretnym wątku i TaskCompletionSource
pozostaje wyłączony przez jakiś czas, co oznacza, zwróconych zadań IsComplete = false
. Potem po pewnym czasie ten sam wątek zadzwoni na numer _tcs.SetResult(x)
, który według mojego zrozumienia powinien uruchomić kontynuację w wątku.
Ale zaobserwowałem w mojej aplikacji, że wątek kontynuujący kontynuację jest w rzeczywistości wciąż tym samym wątkiem, tak jakby kontynuacja została wywołana synchronicznie dokładnie tak, jak nazywa się SetResult
.
Próbowałem nawet ustawić punkt przerwania na SetResult
i przechodząc nad nim (i mając punkt przerwania w kontynuacji), który z kolei w rzeczywistości dalej wywołuje synchroniczną kontynuację.
Kiedy dokładnie SetResult()
natychmiast wywołuje synchronicznie kontynuację?
Pomoże ci, jeśli podasz [mcve] zamiast * pół * tego, więc możemy sami z nim eksperymentować ... –