2012-10-03 21 views

Odpowiedz

27

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 lub Async.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

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

+8

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). –

+1

@TomasPetricek Jeszcze raz - doskonałe informacje o F #. –

Powiązane problemy