This comment przez Stephen Cleary mówi tak:Asp.net SynchronizationContext blokuje HttpApplication na asynchroniczne kontynuacje?
AspNetSynchronizationContext
jest najdziwniejsza realizacja. Traktuje on numerPost
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.
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. –
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. –
Proszę. Będziesz jednym z najbardziej autorytatywnych źródeł na ten temat. –