2013-03-20 6 views
9

Obserwujemy coś dziwnego, kod tak:Każdy scenariusz, w którym Task.ContinueWith (..., TaskScheduler.FromCurrentSynchronizationContext()) nie * uruchomi się * w wątku interfejsu użytkownika?

var task = new Task(...); // run in the background, do something lengthy work 
task.ContinueWith(..., TaskScheduler.FromCurrentSynchronizationContext()); 
task.Start(); 

Drugie zadanie nie wywołuje zdarzenie, które z kolei próbuje zaktualizować GUI, a my się bał wyjątek przekroju gwintu.

Sprawdzanie Thread.CurrentThread.ManagedThreadId z metody w drugim zadaniu wskazuje, że w rzeczywistości jest to , a nie działa w wątku interfejsu użytkownika.

Kod, który zainicjował zadania jest uruchomiony na wątku interfejsu użytkownika.

Czy jest jakiś scenariusz, w którym to pójdzie źle?

+1

Po co tworzyć zadanie bezpośrednio, zamiast uruchamiać Task.StartNew? –

+0

@PanagiotisKanavos, mogą istnieć uzasadnione powody, aby to zrobić (patrz http://blogs.msdn.com/b/pfxteam/archive/2010/06/13/10024153.aspx), ale nie jest to istotne. –

+0

Cóż, nie mogę tego zaszkodzić, ani nie spotkałem się z tą sytuacją lub kontekst stał się pusty, chyba że wezwanie do tworzenia zadań nie zostało zrobione naprawdę w wątku UI. –

Odpowiedz

4

Zakładając, że używasz .NET 4.0, jest błąd, w którym System.Threading.SynchronizationContext.Current w głównym wątku może stać się pusty i wystąpi ten problem. Jeśli możesz łatwo odtworzyć problem, najpierw sprawdź, czy SynchronizationContext.Current ma wartość null, gdy zadzwonisz pod numer TaskScheduler.FromCurrentSynchronizationContext().

Zobacz szczegóły tego problemu tutaj: SynchronizationContext.Current is null in Continuation on the main UI thread

błąd zostanie poprawiony w .NET 4.5.

Powiązane problemy