11

This comment przez Stephen Cleary mówi tak:Asp.net SynchronizationContext blokuje HttpApplication na asynchroniczne kontynuacje?

AspNetSynchronizationContext jest najdziwniejsza realizacja. Traktuje on numer Post jako synchroniczny, a nie asynchroniczny, a używa blokady do wykonywania swoich delegatów po jednym na raz.

Podobnie the article that he wrote on synchronization contexts i związane z tym, że komentarz proponuje:

Koncepcyjnie kontekst AspNetSynchronizationContext jest złożona. W czasie trwania asynchronicznej strony kontekst rozpoczyna się od jednego wątku z puli wątków ASP.NET. Po rozpoczęciu asynchronicznych żądań kontekst nie zawiera żadnych wątków. Po zakończeniu asynchronicznych żądań wątki puli wątków wykonujące swoje procedury uzupełniania wpisują kontekst. Mogą to być te same wątki, które zainicjowały żądania, ale bardziej prawdopodobne jest, że dowolne wątki będą wolne w momencie zakończenia operacji.

Jeśli wiele operacji zostanie zakończonych od razu: dla tej samej aplikacji, AspNetSynchronizationContext zapewni, że będą wykonywane pojedynczo. Mogą być wykonywane w dowolnym wątku, ale ten wątek będzie miał tożsamość i kulturę oryginalnej strony.

Kopiowanie w reflektorze wydaje się potwierdzać to, ponieważ blokuje się na HttpApplication podczas wywoływania dowolnego wywołania zwrotnego.

Zablokowanie obiektu aplikacji wydaje się przerażające. Moje pierwsze pytanie: czy to oznacza, że ​​dzisiaj wszystkie asynchroniczne uzupełnienia dla całej aplikacji są uruchamiane pojedynczo, nawet te, które pochodziły z oddzielnych żądań na osobnych wątkach z oddzielnymi HttpContextami? Czy nie byłoby to ogromnym wąskim gardłem dla aplikacji, które w 100% wykorzystują strony asynchroniczne (lub kontrolery asynchroniczne w MVC)? Jeśli nie, dlaczego nie? czego mi brakuje?

Również w .NET 4.5 wygląda na to, że jest nowy AspNetSynchronizationContext, a stary ma zmienioną nazwę LegacyAspNetSynchronizationContext i jest używany tylko wtedy, gdy nie ustawiono nowego ustawienia aplikacji UseTaskFriendlySynchronizationContext. Pytanie nr 2: Czy nowa implementacja zmienia to zachowanie? W przeciwnym razie, wyobrażam sobie, że dzięki nowym asynchronicznym/oczekującym wsparciem w uzupełnianiu przez kontekst synchronizacji, tego rodzaju wąskie gardło będzie zauważane znacznie częściej w przyszłości.

Odpowiedź na this forum post (związany z tak odpowiedzieć here) sugeruje, że coś fundamentalnie zmieniło, ale chcę być jasne, co to jest i jakie zachowania uległy poprawie, ponieważ mamy .NET 4 MVC 3 aplikacja, która jest prawie 100% asynchronicznych metod działania polegających na wywoływaniu usług sieciowych.

+0

Podejrzewam, że istniejące zachowanie zostało uznane za "wystarczająco dobre". Pamiętaj, że same operacje asynchroniczne są niezależne; są zsynchronizowane tylko ich procedury uzupełniania (i kontynuacje). Poza tym strony asynchroniczne były twarde przed wersją 4.5; większość aplikacji ASP.NET obecnie jest synchronicznych. –

+0

I nie miałem okazji sprawdzić nowego synccontext ASP.NET. Właśnie dostałem 4.5 z VS2012RC zainstalowanym w ostatni weekend, w rzeczywistości! Ale odpowiem tutaj w końcu, jeśli nikt inny nie zrobi. –

+0

Proszę. Będziesz jednym z najbardziej autorytatywnych źródeł na ten temat. –

Odpowiedz

10

Pozwól mi odpowiedzieć na twoje pierwsze pytanie. W twoim założeniu nie brałeś pod uwagę faktu, że oddzielne żądania ASP.NET są przetwarzane przez różne obiekty HttpApplication. Obiekty HttpApplication są przechowywane w puli. Po zażądaniu strony obiekt aplikacji jest pobierany z puli i należy do żądania aż do jego zakończenia.Więc moja odpowiedź na pytanie:

wszystkie asynchroniczne Realizacje dla całej aplikacji wykonać po jednym na raz, nawet te, które pochodzi z oddzielnych wniosków dotyczących poszczególnych wątków z oddzielnych HttpContexts

brzmi: Nie, nie są one przetwarzane przez oddzielne obiekty HttpApplication, zablokowane HttpApplication będzie miało wpływ tylko na pojedyncze żądanie. Kontekst synchronizacji to potężna funkcja, która pomaga programistom w synchronizowaniu dostępu do zasobów udostępnianych (w ramach żądania). Dlatego wszystkie wywołania zwrotne są wykonywane pod blokadą. Kontekst synchronizacji jest sercem opartego na zdarzeniach wzorca synchronizacji.

+0

Irony właśnie zdałem sobie sprawę z tego rano w drodze do pracy, rozważając http://stackoverflow.com/questions/9413585/do-asynchronous-httpapplication-events-wait-until-they-return/11731051#11731051. Twoja odpowiedź na temat oddzielnej aplikacji HttpApplication na żądanie jest absolutnie poprawna. Dzięki za wgląd. –

Powiązane problemy