Czy asynchroniczna implementacja w C# 4.5 jest dokładnie taka sama jak w F # 2 w sposobie używania wątków?Czy asynchroniczny w C# jest taki sam jak w F #?
Odpowiedz
Są różne. Główną różnicą jest to, że C# używa standardowego .NET Task<T>
do reprezentowania obliczeń asynchronicznych, podczas gdy F # używa własnego typu o nazwie Async<T>
.
Dokładniej, najważniejsze różnice to:
AC Metoda # asynchroniczny tworzy
Task<T>
, który natychmiast zaczął (gorąco zadanie model), podczas gdy F # tworzy obliczeń, które trzeba zacząć wyraźnie (model generatora). Oznacza to, że obliczenia F # są łatwiejsze do skomponowania (możesz pisać abstrakcje o wyższym poziomie).W języku F # uzyskasz także lepszą kontrolę nad sposobem obliczania. Możesz rozpocząć obliczenia, używając
Async.Start
, aby uruchomić go w tle lubAsync.StartImmediate
, aby uruchomić go w bieżącym wątku.F # asynchroniczny przepływ pracy obsługuje anulowanie automatycznie, więc nie trzeba przekazywać
CancellationToken
wokół.Może Inną konsekwencją pierwszego punktu jest to, że F przepływy # asynchroniczny również wspierać ogon-rekurencji, więc można napisać rekurencyjnych przepływów pracy (to nie będzie działać łatwo w języku C#, ale C# nie używa tego stylu programowania)
Napisałem bardziej szczegółowy artykuł na ten temat: Asynchronous C# and F# (II.): How do they differ?
- 1. Czy Mallocator Stephena Lavaveja jest taki sam w C++ 11?
- 2. Czy dp jest taki sam jak dip?
- 3. Czy R.layout.listview jest taki sam jak R.id.listview
- 4. Czy LinqToSQL jest taki sam jak Linq?
- 5. Czy AppendHeader jest dokładnie taki sam jak AddHeader?
- 6. Czy int jest taki sam jak niepodpisany lub podpisany?
- 7. Czy $ PROGRAM_NAME jest taki sam jak 0 rubinów?
- 8. Czy rozmiar znaku * jest taki sam jak rozmiar int *?
- 9. Czy model pamięci Dalvika jest taki sam jak język Java?
- 10. Jak utworzyć asynchroniczny HttpWebRequest w Silverlight (F #)
- 11. W konstrukcji kompilatora symbol jest taki sam jak tokena?
- 12. Czy kontroler nadzorujący MVC i MVP jest taki sam?
- 13. Czy możliwe jest rozszerzenie ControlTemplate w taki sam sposób, jak rozszerzenie stylu w WPF?
- 14. W języku C, jest warunek: "if (a! = NULL)" taki sam jak warunek "if (a)"?
- 15. Czy zmienne słowo kluczowe C# i java zachowuje się w taki sam sposób?
- 16. Dlaczego rozmiar pustego dyktatu jest taki sam, jak w pustym dykcie w Pythonie?
- 17. Czy program cudaFree() jest asynchroniczny?
- 18. Makro powtórzyć prawie taki sam kod
- 19. Dwa asynchroniczny AJAX wzywa powraca sam wynik
- 20. Taki sam .vimrc, dwa różne komputery
- 21. Czy intellij może organizować import w taki sam sposób jak w Eclipse?
- 22. Jeśli metoda rozszerzenia ma taki sam podpis jak metoda w zaplombowanej klasie, jakie jest pierwszeństwo połączenia?
- 23. Czy jest zagwarantowane, że typ T [x] [y] ma taki sam układ pamięci co T [x * y] w C?
- 24. Sprawdź, czy dwa ciągi mają taki sam wzorzec powtarzanych znaków.
- 25. Czy JVM OpenJDK jest taki sam, jak JVM Oracle Java SE?
- 26. Czy jest możliwe użycie CallerMemberNameAttribute w f #
- 27. Czy program Python Decorator jest taki sam jak adnotacja Java lub Java z aspektami?
- 28. Computing Podpis/Hash w JavaScript i mieć taki sam wynik jak C#
- 29. Czy istnieje odpowiednik F # Seq.windowed w C#?
- 30. Dlaczego mój HTTP_USER_AGENT nie zawsze jest taki sam?
Wielkie dzięki! Ale w jaki sposób wątki są używane pod maską? Don Syme wskazuje w swojej książce "Expert F #", że F # używa przeskakiwania wątków. Czy to samo dla C# czy są jakieś różnice? – Andries
W języku F #, po uruchomieniu wątku z określonym "SynchronizationContext" (tj. Wątku GUI), obliczenia asynchroniczne przeskakują z powrotem do tego 'SynchronizationContext'. Nie mogłem znaleźć dokumentacji mówiącej, jak to zachowuje się w języku C#, ale moje eksperymenty pokazują, że zachowuje się tak samo - to znaczy, jeśli zaczniesz 'czekać na wątek GUI, wtedy reszta twoich obliczeń będzie działała na wątku GUI (nawet jeśli oczekiwana kompilacja jest kontynuacją innego wątku). –
@TomasPetricek Jeszcze raz - doskonałe informacje o F #. –