2013-03-03 8 views
7

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?

+4

Czego więcej chcesz? Nie można go używać w niebezpiecznych blokach. –

+0

@MitchWheat Przyznaję, że tu lgnę, ale może OP szuka informacji na temat tego, co to znaczy *. –

+1

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ć. –

Odpowiedz

7

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.

+0

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! –

Powiązane problemy