Test_Click
poniżej jest uproszczoną wersją kodu, który działa na wątku UI (z WindowsFormsSynchronizationContext):Czy Task.ContinueWith przechwytywanie kontekst wątku wywołania dla kontynuacji?
void Test_Click(object sender, EventArgs e)
{
var task = DoNavigationAsync();
task.ContinueWith((t) =>
{
MessageBox.Show("Navigation done!");
}, TaskScheduler.FromCurrentSynchronizationContext());
}
Mam jawnie określić TaskScheduler.FromCurrentSynchronizationContext()
aby upewnić się, że kontynuacja działania będą realizowane w tym samym wątku UI? Czy też ContinueWith
przechwytuje kontekst wykonania automatycznie (co sprawia, że argument TaskScheduler
jest w takim przypadku nadmiarowy)?
Zakładam, że nie robi tego domyślnie (w przeciwieństwie do await
), ale do tej pory nie mogłem znaleźć zasobu online, aby to potwierdzić.
Dziękuję, ma sens. Znalazłem również [this] (http://www.jaylee.org/post/2012/09/29/C-Async-Tips-and-Tricks-Part-3-Tasks-and-synchronization-Context .aspx), powiązane i bardzo pomocne. – Noseratio
Jeszcze łatwiej znaleźć teraz ze źródłem referencji: http://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/Task.cs#27c5b7fbe5caaa18 W związku z tym, proszę wyjaśnić, co robi StackCrawlMark? – Kakira