2012-04-04 42 views
15

Pracowałem nad prezentacją i uważałem, że następujące rzeczy powinny zakończyć się niepowodzeniem, ponieważ właściwość ActionResult nie jest zwracana we właściwym kontekście. Mam obciążenia testowane z VS i nie dostałem błędów. Debugowałem go i wiem, że przełącza wątki. Wygląda więc na to, że jest to poprawny kod.Wywoływanie programu ConfigureAwait z akcji ASP.NET MVC

Czy program ASP.NET nie dba o to, jaki kontekst lub wątek jest włączony, tak jak aplikacja kliencka? Jeśli tak, to w jakim celu dostarcza AspNetSynchronizationContext? Nie mam racji umieszczając plik ConfigureAwait w samej akcji. Coś w tym jest nie tak. Czy ktoś może wyjaśnić?

public async Task<ActionResult> AsyncWithBackendTest() 
    { 
     var result = await BackendCall().ConfigureAwait(false); 
     var server = HttpContext.Server; 
     HttpContext.Cache["hello"] = "world"; 
     return Content(result); 
    } 
+2

Prawidłowa odpowiedź powinna brzmieć: dlaczego jest to całkowicie OK lub powinna dawać przykład tego, co nie powiedzie się, gdy spróbujesz tego dokonać.Moje jelito mówi mi, że nie powinienem, ale chciałbym mieć fakty, żeby mnie poprzeć. –

Odpowiedz

6

Program ASP.NET nie ma potrzeby "wątku interfejsu użytkownika" wymaganej przez wiele aplikacji klienckich (ze względu na strukturę interfejsu pod nim). Że nie chodzi o kontekst wątku powinowactwem, ale do śledzenia postępów stronę (i inne rzeczy, jak roznosić kontekście zabezpieczeń na życzenie)

Stephen Toub mentions this in an MSDN article:

Windows Forms nie jest jedynym środowiskiem która zapewnia klasę pochodną SynchronizationContext. ASP.NET zapewnia także jedną, AspNetSynchronizationContext, ale nie jest to publiczne i nie jest przeznaczone do użytku zewnętrznego. Zamiast tego jest używany pod osłonami przez ASP.NET, aby ułatwić funkcjonalność asynchronicznych stron w ASP.NET 2.0 (więcej informacji na ten temat można znaleźć w witrynie msdn.microsoft.com/msdnmag/issues/05/10/WickedCode). Ta implementacja umożliwia programowi ASP.NET zapobieganie zakończeniu przetwarzania stron , dopóki nie zostaną zakończone wszystkie zaległe asynchroniczne wywołania.

Nieco więcej szczegółów na temat kontekstu synchronizacji podano w Stephen Cleary's article from last year.

Rysunek 4 pokazuje w szczególności, że nie ma on "specyficznego wątku" WinForms/WPF, ale całość jest świetną lekturą.

Jeśli wielokrotne operacje kompletny naraz do tego samego wniosku, AspNetSynchronizationContext zapewni, że wykona jeden na czasie. Mogą one być wykonywane w dowolnym wątku, ale ten wątek będzie miał tożsamość i kulturę oryginalnej strony .

+0

W przypadku asynchronizacji zdarzeń stosowane są wyjątkowe wywołania asynchroniczne, ale nie ma ona zastosowania w asynchronice opartej na zadaniach, ponieważ do końca działania nie zostaną wykonane żadne nieodebrane wywołania. Ponadto dzięki debugowaniu widzę, że tożsamość formularza użytkownika i jego języki (bezpieczeństwo i kultura) pozostają nienaruszone po zakończeniu działania programu ConfigureAwait. Czytam więc powody dla SyncContext, ale nic nie jest zepsute. Co mogę zrobić, aby udowodnić, że nie powinno się tutaj używać ConfigureAwait? –

4

W Twoim kodzie HttpContext jest członkiem Twojej podstawowej klasy AsyncController. To nie jest bieżący kontekst dla wykonywanego wątku.

Również w twoim przypadku HttpContext jest nadal ważny, ponieważ żądanie nie zostało jeszcze zakończone.

Nie mogę tego przetestować w tej chwili, ale spodziewam się, że to się nie powiedzie, jeśli użyłeś System.Web.HttpContext.Current zamiast HttpContext.

P.S. Bezpieczeństwo jest zawsze propagowane zawsze, niezależnie od ConfigureAwait - ma to sens, jeśli się nad tym zastanowić. Nie jestem pewien co do kultury, ale nie zdziwiłbym się, gdyby była zawsze propagowana.

+0

Tak, moje zmienne zawsze będą ważne, ponieważ po prostu zostaną zawinięte w stos. Ale nawet System.Web.HttpContext.Current nadal ma prawidłowe i poprawne dane. –

+0

Czy 'BackendCall' zwraca synchronicznie? –

+0

Nie. Oprócz kontroli logicznej debugowałem ją i obserwowałem, jak przełącza wątki. –

Powiązane problemy