2011-12-09 9 views

Odpowiedz

10

Jak mówi Reed, to naprawdę zależy od kontekstu. Kod musi być uruchamiany pod adresem z pewnym punktem - ale w zależności od kontekstu może zostać uruchomiony na wątku puli wątków zamiast na krytycznym.

Zamiast używać Task.Run, użyję TaskEx.Yield:

public async Task Foo() 
{ 
    await TaskEx.Yield(); 
    // Do expensive stuff 
} 

O ile jestem świadomy, że w zasadzie sposobem natychmiast wraca do rozmówcy, ale pozwalając resztę metody asynchronicznej do Zaplanuj od razu. Jeśli jesteś w czymś podobnym do wątku Windows Forms UI, nie ma sensu robić tego, ponieważ wrócisz do wątku UI (i tam będziesz musiał uruchomić kosztowny kod) natychmiast - ale miałoby to sens, jeśli jesteś w kontekście gdzie bieżący wątek nie powinien być blokowany, ale kontynuacje są uruchamiane w innym wątku.

5

To nie musi być złe, ale może mieć nieoczekiwane konsekwencje. Jeśli rozmówca spodziewa się, że kod będzie zachowywał się całkowicie asynchronicznie, kosztowny kod będzie działał synchronicznie. To spowoduje, że będzie zachowywać się częściowo jak metoda synchroniczna, ale także asynchronicznie, co jest najgorszym z obu światów (dodatkowa złożoność z asynchronii bez reaktywności ...)

Jeśli to możliwe, polecam próbować jako "kosztowny" kod prowadzący do pierwszego czekają. Korzystanie z Task.Run (lub w CTP) w celu zawinięcia kosztownego kodu lub przeniesienia kosztownego kodu do własnej asynchronicznej metody (na której można by było await) byłoby korzystne w tym przypadku.

Powiązane problemy