Zgodnie z http://blogs.msdn.com/b/pfxteam/archive/2012/04/12/async-await-faq.aspx słowo kluczowe await
jest zabronione wewnątrz bloku unsafe
, wspominając jedynie o "trudnościach związanych z zachowaniem niezarządzanych wskaźników". Czy istnieje dobre wyjaśnienie na temat tych trudności?Dlaczego w niebezpiecznych sekcjach oczekuje się zabronienia?
Odpowiedz
Dwie podstawowe rzeczy, które musisz wiedzieć. Metoda asynchroniczna zostaje przepisana przez kompilator C# na małą klasę z niewypowiedzianą nazwą, która otacza automat stanów. Zmienne lokalne metody asynchronicznej stają się polami tej klasy.
Niebezpieczny kod często polega na możliwości tworzenia wskaźników do zmiennych lokalnych. Stwierdzenie ustalone jest taka, tworzy ukrytą zmienną lokalną, które garbage collector może zobaczyć i tym samym aktualizuje się, gdy pojawia się kolekcja śmieci, która przenosi tablicę, która jest naprawiana. Tworzenie wskaźników na zmienne lokalne jest w porządku, zmienne te nie podlegają przeniesieniu przez garbage collector. Stos wątku zawsze znajduje się w stałej lokalizacji w przestrzeni adresowej pamięci wirtualnej.
Połączyć dwa i zobaczysz problem, zmienna lokalna może zamienić się w pole klasy, pole, którego adres zmienia się, gdy nastąpi wywóz śmieci. Nagle przekierowanie niebezpiecznego kodu do łamania kodu.
fragment kodu, który demonstruje problem:
class Example {
int field;
unsafe void Method() {
int local = 42;
int* p = &local; // fine
int* q = &field; // CS0212
}
}
C# zespół mógłby podjęły starania, aby dokładnie przeanalizować przypadki, w których kod jest nadal niebezpieczny porządku po przepisywanie. Ale niektóre przypadki po prostu nie dają się naprawić, jak na przykład poprawiona instrukcja. Mnóstwo pracy, aby dać programistom niezadowalającą wiadomość, często z oszałamiającego powodu. Przy zdrowych zmysłach wystarczyło po prostu ogłosić niebezpieczny kod poza limitami.
To ma sens. Szkoda, że odpowiedni automat stanów nie może być po prostu zadeklarowany jako "naprawiony" (opcjonalnie, jak przypuszczam) i powinien być z nim zrobiony. Domyślam się, że rozwiązaniem jest jawne przydzielenie potrzebnych zmiennych zamknięcia do klasy, naprawienie tej klasy i odpowiednie jej odniesienie. Ale to daje połowę korzyści z asynchronicznego kreowania pisarzy. Szkoda! –
- 1. Implementowanie niebezpiecznych interfejsów Java
- 2. Usuwanie C# Niebezpiecznych wskaźników
- 3. "używa niezaznaczonych lub niebezpiecznych operacji"
- 4. Awaria podczas wyszukiwania w dwóch sekcjach
- 5. Jak używać niebezpiecznych wartości w wyliczaniu?
- 6. UITableView przestrzeń między wiersza i sekcjach
- 7. TypeError: Oczekuje ciąg lub bufor
- 8. Python podproces komunikować() daje Brak, gdy oczekuje się lista numer
- 9. assertEquals, co jest rzeczywiste i czego się oczekuje?
- 10. ORA 01858: Postać nienumeryczny stwierdzono, gdzie oczekuje się numeryczny
- 11. ASP.NET MVC 4 Dev Podgląd Razor w sekcjach Błąd
- 12. JSHint: Jak wyłączyć sprawdzanie niebezpiecznych znaków w komentarzach?
- 13. Oczekuje się zwrócić wartość na końcu funkcji strzałki
- 14. nieprawidłowy schemat oczekuje MongoDB
- 15. Czy wskaźniki są prywatne w sekcjach równoległych OpenMP?
- 16. Czy mogę stosować filtry CSS (3) TYLKO w sekcjach obrazu?
- 17. klauzula domyślna przed sekcjach przypadek w instrukcji switch
- 18. Autoloader oczekuje klasy Symfony2
- 19. Błąd maszynopisu TS1005: ";" Oczekuje
- 20. Jak mogę powiększyć/pomniejszyć moją stronę bez wpływu sekcjach
- 21. Utwórz odwołanie do podagray w języku C# (przy użyciu niebezpiecznych?)
- 22. Nowością Sass, oczekując oczekuje selektor
- 23. Aktywny zasób narzekają oczekuje hash
- 24. obiekt importu oczekuje Błąd w Golang 1.4.2
- 25. ftp_login oczekuje parametr 1 być zasobem
- 26. Czy GHC może ostrzec o wykorzystaniu niebezpiecznych funkcji nie sumujących się?
- 27. Newtonsoft.Json.JsonReaderException: niezakłócony ciąg. Oczekuje ogranicznik
- 28. ORA-00932: niespójne datatypes: Oczekuje - dostał CLOB
- 29. Aplet Java - "Blokowanie potencjalnie niebezpiecznych komponentów przed uruchomieniem?" message
- 30. Jak zdobyć IntelliJ ostrzegać o niebezpiecznych zwyczajów Optional.get()
Czego więcej chcesz? Nie można go używać w niebezpiecznych blokach. –
@MitchWheat Przyznaję, że tu lgnę, ale może OP szuka informacji na temat tego, co to znaczy *. –
Oznacza to, że nie możesz go tam użyć! Nawet ze szczegółowym wyjaśnieniem, nadal nie będziesz mógł go tam użyć. Być może OP powinien wyjaśnić problem, który próbują rozwiązać. –