8

Znalazłem Difference between […]Async and Begin[…] .net asynchronous APIs pytanie, ale this answer trochę mnie zdezorientowało.APM, EAP i TPL on Socket Programming

Mówiąc o tych wzorców, Stephen powiedział:

Większość * metody asynchroniczne (z odpowiednią * Wykonane zdarzenia) są za pomocą opartego na zdarzeniu Asynchronous Wzorzec. Starsze (ale wciąż całkowicie poprawne) Begin * i End * to wzorzec zwany Asynchronicznym Modelem Programistycznym.

Klasa Socket jest wyjątkiem od tej reguły; jego * Metody asynchroniczne nie mają żadnych odpowiednich zdarzeń; jest to zasadniczo tylko APM wykonane w taki sposób, aby uniknąć nadmiernej alokacji pamięci.

Używam go jako metody * Asynchroniczne są bardziej wydajne, przynajmniej jeśli chodzi o gniazda. Ale potem wspomniał Task Parallel Library:

Jednak zarówno APM i EBAP są zastępowane przez znacznie bardziej elastyczne podejście oparte na Parallel Library zadań. Ponieważ TPL może łatwo owijać APM-y, starsze klasy prawdopodobnie nie będą aktualizowane bezpośrednio; Metody rozszerzeń służą do zapewnienia ekwiwalentów zadań dla starych metod APM.

znalazłem TPL and Traditional .NET Asynchronous Programming na MSDN, znam podstawy OC, tworzenie zadań, odwołania, kontynuacje, etc, ale nadal nie rozumieją te:

Jakie są zalety asynchronicznego model programowania (APM) i Wzorzec asynchroniczny oparty na zdarzeniach (EAP) w porównaniu do siebie nawzajem? W jaki sposób TPL może łatwo zawijać APMy oznacza, że ​​zarówno APM jak i EAP są zastąpione z TPL?

I co najważniejsze: które powinienem użyć w programowaniu gniazd;

  • APM?
  • EAP?
  • APM lub EAP opakowane przez zadanie?
  • TPL za pomocą metod blokowania klasy Socket w zadaniach?
  • Inne?
+0

zobacz: http://stackoverflow.com/questions/5834755/turning-async-socket-parallel-and-not-on-concrentrent- in-very-intensive-applicat –

Odpowiedz

6

Jak OC można łatwo owinąć APM oznacza, że ​​zarówno APM i EAP są zastępowane OC?

Nie dotyczy. Wether APM i EAP zostaną zastąpione przez TAP (Task Asynchronous Pattern) lub nie w nowych API nie ma to nic wspólnego. Oczekuję, że TAP zastąpi APM i EAP z różnych powodów. Głównym powodem dla mnie jest to, że kod piszący do korzystania z TAP komponuje się znacznie lepiej. Wykonanie .ContinueWith(/* ... */).ContinueWith(/* ... */) ogólnie czyta o wiele lepiej niż odpowiadający kod, który należy zapisać, aby połączyć asynchroniczne wywołania metodami Begin/End, nawet jeśli nie bierze się pod uwagę opcji, które można przekazać do ContinueWith w celu ustalenia, czy kontynuacja powinna zostać uruchomiona. TPL oferuje również różne kombinatory dla zadań, takie jak WaitAll i WaitAny, dzięki czemu niektóre scenariusze mogą być znacznie łatwiejsze. Obsługa języków przychodzących w języku C# i VB.NET za pomocą słów kluczowych async/aaait sprawi, że będzie to jeszcze łatwiejsze.

Możliwość pakowania APM w TAP ułatwia przejście do tego schematu, ponieważ oznacza to, że nie trzeba przepisywać istniejącego kodu, aby pasował do nowego modelu.

Którego powinienem użyć w programowaniu gniazd?

Polecam za pomocą TAP owijania metod APM na Socket. O ile nie można udowodnić, że dodatkowe obciążenie związane z zawijaniem metod Begin/End w zadaniu jest różnicą między skalowalną/szybką wystarczającą lub nie, skorzystam z łatwości kodowania TAP.

3

Gideon świetnie odpowiedź; Właśnie chciałem dostarczyć nieco więcej tła:

Jakie są zalety Asynchronous Programming Model (APM) i Asynchronous Pattern (EAP) w oparciu o zdarzenia w porównaniu do siebie?

APM jest bardziej powszechny i ​​ma ściśle zdefiniowany wzór. np. TPL ma generyczne opakowania dla metod APM (TaskFactory.FromAsync), ale nie może zrobić tego samego dla EAP, ponieważ EAP nie jest tak ściśle zdefiniowany.

EAP ma jedną wielką zaletę: wywołania zwrotne zdarzeń obsługują ciebie. Są więc naprawdę dobre dla np. Podstawowych operacji w tle dla interfejsu użytkownika (BackgroundWorker).

TAP łączy w sobie to, co najlepsze z obu światów: automatyczną wątkowość wątków domyślnie i ściśle określony, wspólny wzorzec. Ma również ładną reprezentację obiektową dla operacji asynchronicznej (Task).

W jaki sposób "TPL może łatwo pakować APM" oznacza, że ​​"zarówno APM, jak i EAP są zastępowane przez TPL"?

Nie dotyczy.

"Jednak zarówno APM, jak i EBAP są zastępowane bardziej elastycznym podejściem opartym na bibliotece zadań równoległych." - co oznacza, że ​​nowy kod nie musi zawierać metod/zdarzeń APM/EAP; nowy kod powinien zawierać metody TAP.

"Ponieważ TPL może łatwo owijać APM-y, starsze klasy najprawdopodobniej nie będą aktualizowane bezpośrednio, a metody rozszerzeń są używane do zapewnienia ekwiwalentów zadań dla starych metod APM." - co oznacza, że ​​możesz dodać metody TAP do istniejącego typu APM, używając TaskFactory.FromAsync; Pomyślałem, że zespół TPL podejmie takie podejście, zamiast modyfikować tonę klas w BCL. Jednak myliłem się w tym przypuszczeniu. Ze względu na wydajność, zespół BCL/TPL dokonał przeglądu całego szkieletu i dodał metody TAP bezpośrednio do klas .NET zamiast korzystania z metod rozszerzeń. Nowe metody TAP są zawarte w .NET 4.5, wkrótce ...

+1

TAP sam nie tworzy wątków. Ale TAP w połączeniu z 'await' ma. – svick

+1

Myślę, że to zależy od definicji "TAP". Załączam "async" i "czekaj" w TAP. –