Zwracam uwagę, że nikt nie wspomniał w swoich odpowiedziach na to stare pytanie, że zwolnienie blokady w przypadku wyjątku jest niezwykle niebezpieczną rzeczą. Tak, instrukcje blokujące w języku C # mają semantykę „w końcu”; kiedy sterowanie wychodzi z blokady normalnie lub nienormalnie, blokada zostaje zwolniona. Wszyscy mówicie o tym, jakby to było dobre, ale to jest złe! Właściwą rzeczą do zrobienia, jeśli masz zablokowany region, który zgłasza nieobsługiwany wyjątek, jest przerwanie chorego procesu bezpośrednio przed zniszczeniem większej ilości danych użytkownika , a nie zwolnienie blokady i kontynuowanie .
Spójrz na to w ten sposób: przypuśćmy, że masz łazienkę z zamkiem w drzwiach i kolejką ludzi czekających na zewnątrz. Bomba w łazience wybucha, zabijając osobę w środku. Twoje pytanie brzmi: „czy w takiej sytuacji zamek zostanie automatycznie odblokowany, aby następna osoba mogła wejść do łazienki?” Tak, to będzie. To nie jest dobra rzecz. Właśnie tam wybuchła bomba i kogoś zabiła! Prawdopodobnie kanalizacja jest zniszczona, dom nie jest już w dobrym stanie konstrukcyjnym i może być tam kolejna bomba . Należy jak najszybciej wyprowadzić wszystkich i zburzyć cały dom.
To znaczy, przemyśl to: jeśli zablokowałeś region kodu, aby odczytać ze struktury danych bez mutacji w innym wątku, a coś w tej strukturze danych rzuciło wyjątek, szanse są dobre, ponieważ struktura danych jest uszkodzony . Dane użytkownika są teraz pomieszane; nie chcesz w tym momencie próbować zapisywać danych użytkownika, ponieważ zapisujesz uszkodzone dane. Po prostu zakończ proces.
Jeśli zablokowałeś region kodu w celu wykonania mutacji bez kolejnego wątku odczytującego stan w tym samym czasie, a mutacja wyrzuca, to jeśli dane nie były wcześniej uszkodzone, na pewno tak jest teraz . Przed którym dokładnie scenariuszem ma chronić zamek . Teraz kod, który czeka na odczytanie tego stanu, natychmiast uzyska dostęp do uszkodzonego stanu i prawdopodobnie sam się zawiesi. Ponownie, właściwą rzeczą jest zakończenie procesu.
Bez względu na to, jak go pokroisz, wyjątek w zamku to zła wiadomość . Właściwe pytanie nie brzmi: „czy mój zamek zostanie wyczyszczony w przypadku wyjątku?” Właściwe pytanie, które należy zadać, brzmi: „w jaki sposób mogę upewnić się, że wewnątrz blokady nigdy nie ma wyjątku? A jeśli tak, to w jaki sposób ustrukturyzować mój program, aby mutacje zostały przywrócone do poprzedniego dobrego stanu?”