2013-08-13 10 views
6

Jedną z najfajniejszych rzeczy w C# 5.0 są słowa kluczowe async/await oraz sposób, w jaki upraszcza on prace hydrauliczne, które musiałeś pisać z Task Parallel Library (TPL).Czy istnieje sposób na wymuszenie asynchronizacji/oczekiwania na kontynuację pierwszego dostępnego wątku?

Moje pytanie brzmi: jeśli masz kod agnostyczny wątku i uruchamiasz operację asynchroniczną w głównym wątku (czytaj: wątek UI), ale nie musisz przejmować się, czy kontynuacja przebiega w głównym wątku, to możesz Czy powinieneś powiedzieć paradygmatowi async/await, że chcesz go kontynuować w pierwszym dostępnym wątku, nawet jeśli nie jest to główny wątek?

Sądzę, że możliwość wykonania tego znacznie zwiększyłaby wydajność niektórych scenariuszy, ale nie srebrną kulę.

+2

Należy pamiętać, że posiadanie tej umiejętności jest bardzo ważne dla prawidłowego funkcjonowania w niektórych przypadkach, a nie tylko wydajności. Możesz uniknąć powstawania zakleszczeń, upewniając się, że pewne kontynuacje nie działają w przechwyconym kontekście. – Servy

Odpowiedz

15

Jeśli nie obchodzi gdzie reszta sposób jest kontynuowany, należy Task.ConfigureAwait:

await foo.DoSomethingAsync().ConfigureAwait(continueOnCapturedContext: false); 

(Nie mieć użyć nazwanego argumentu, ale to zwiększa przejrzystość.)

Aby uzyskać więcej informacji, zobacz część "Konfigurowanie kontekstu" pod numerem Stephen Cleary's "best practices" article.

+0

Dobra, ale w dobry sposób. :) Chodzi mi o to: napisałem ten artykuł, ale jest to pochlebne, że uważasz go za jakość Toub. –

+0

@StephenCleary: Ups, przepraszam. Szukałem "dobrych praktyk Stephena Touba" ConfigureAwait "i odkryłem, że - wtedy nie sprawdzałem autorstwa. Głębokie przeprosiny! (Jestem pewien, że widziałem inny artykuł * naprawdę * Touba na ten temat ...) –

Powiązane problemy