W mojej aplikacji mam metodę statyczną, która jest wywoływana z wielu wątków w tym samym czasie. Czy istnieje niebezpieczeństwo pomylenia moich danych?
W mojej pierwszej próbie metoda nie była statyczna i tworzyłem wiele instancji tej klasy. W takim przypadku moje dane zostały w jakiś sposób pomieszane. Nie jestem pewien, jak to się dzieje, ponieważ zdarza się to tylko czasami. Nadal debuguję. Ale teraz metoda jest statyczna i jak dotąd nie mam żadnych problemów. Może to tylko szczęście. Nie wiem na pewno.
c#
multithreading
static
TalkingCode
źródło
źródło
Odpowiedzi:
Zmienne zadeklarowane wewnątrz metod (z możliwym wyjątkiem „ przechwyconych ” zmiennych) są izolowane, więc nie wystąpią żadne nieodłączne problemy; jeśli jednak Twoja metoda statyczna uzyskuje dostęp do dowolnego stanu wspólnego, wszystkie zakłady są wyłączone.
Przykłady stanu współdzielonego to:
Jeśli masz wspólny stan, musisz:
whatever.SomeData
wielokrotnie, wczytujeszwhatever.SomeData
raz do zmiennej lokalnej, a następnie po prostu użyj zmiennej - pamiętaj, że pomaga to tylko w przypadku niezmiennego stanu!)źródło
Tak, to tylko szczęście. ;)
Nie ma znaczenia, czy metoda jest statyczna, czy nie, ważne jest, czy dane są statyczne, czy nie.
Jeśli każdy wątek ma własne, oddzielne wystąpienie klasy z własnym zestawem danych, nie ma ryzyka pomieszania danych. Jeśli dane są statyczne, istnieje tylko jeden zestaw danych, a wszystkie wątki współużytkują te same dane, więc nie ma sposobu, aby ich nie pomieszać.
Kiedy dane w oddzielnych instancjach nadal się mieszają, najprawdopodobniej nie są one tak naprawdę oddzielne.
źródło
It doesn't matter if the method is static or not, what matters is if the data is static or not
. Dodam, że zmienne lokalne zadeklarowane w ramach metody statycznej nie stanowią tej części danych, o którą w danym scenariuszu musimy się przejmować.Metody statyczne powinny być odpowiednie dla wielu wątków.
Z drugiej strony dane statyczne mogą powodować problem, ponieważ próby uzyskania dostępu do tych samych danych z różnych wątków muszą być kontrolowane, aby zapewnić, że tylko jeden wątek na raz odczytuje lub zapisuje dane.
źródło
MSDN zawsze mówi:
Edycja: Jak mówią ludzie tutaj, nie zawsze tak jest i wyraźnie dotyczy to klas zaprojektowanych w ten sposób w BCL, a nie klas utworzonych przez użytkowników, gdzie to nie ma zastosowania.
źródło