Myślę, że dostrzegłem poważny błąd w TPL. Nie jestem pewien. Spędziłem dużo czasu na drapaniu się po głowie i nie mogę zrozumieć zachowania. Czy ktoś może pomóc?Błąd w TPL - TaskContinuationOptions.ExecuteSynchronously?
Co mój scenariusz jest:
- utworzyć zadanie, które wykonuje prostą rzecz. Bez wyjątków itp.
- Rejestruję kontynuację z ustawieniem ExecuteSynchronously. Musi być na tym samym wątku.
- Uruchamiam zadanie na domyślnym taskcheduler (ThreadPool). Początkowy wątek przebiega i czeka na niego.
- Zadanie rozpoczyna się. Karnety.
- Kontynuacja rozpoczyna się w tym samym wątku co zadanie (wykonanie poprzedniego zadania!) I wchodzi w nieskończoną pętlę.
- Nic się nie dzieje z oczekującym wątkiem. Nie chce iść dalej. Zatrzymany na poczekaniu. Sprawdziłem w debugerze, zadaniem jest RunToCompletion.
Oto mój kod. Doceniamy każdą pomoc!
// note: using new Task() and then Start() to avoid race condition dangerous
// with TaskContinuationOptions.ExecuteSynchronously flag set on continuation.
var task = new Task(() => { /* just return */ });
task.ContinueWith(
_task => { while (true) { } /* never return */ },
TaskContinuationOptions.ExecuteSynchronously);
task.Start(TaskScheduler.Default);
task.Wait(); // a thread hangs here forever even when EnterEndlessLoop is already called.
Też myślę, że to jest błąd. Oto strona dokumentacji: http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskcontinuationoptions.aspx Niestety nie mówi nic o tej sprawie. – usr
Czy istnieje możliwość rozszerzenia fragmentu kodu tak, aby inni mogli go skopiować i wkleić? –
@usr - mówi: "Tylko bardzo krótkie kontynuacje powinny być wykonywane synchronicznie." :) Zgadzam się, że to błąd. –