2012-10-24 7 views
17

Moje podejście polega na tym, aby nie używać metod statycznych i klas w ramach operacji asynchronicznych - chyba że zaimplementowano pewną technikę blokowania, aby zapobiec warunkom wyścigu.Jak używać statycznych metod/klas w ramach operacji async/await?

Teraz async/await został wprowadzony do struktury C# 4.5+ - co upraszcza aplikacje wielowątkowe i zachęca do szybkiego reagowania.

Jednak - jako blokada nie może/nie powinna być umieszczona nad metodą oczekującą (i nie debatuję), czy teraz robi ona statyczne metody wykorzystujące asynchroniczne/oczekiwanie całkowicie nadmiarowe?

+0

Wywołanie metody statycznej z wielu wątków będzie w porządku, jeśli nie będzie żadnych skutków ubocznych. –

+0

Jeśli metoda ma efekty uboczne, to nie powinna być w pierwszej kolejności statyczna, ponieważ narusza wytyczną, że należy unikać globalnego stanu zmiennego. – CodesInChaos

+0

@CodesInChaos Nie sądzę, że można * naruszać * wytyczne ;-) Tak czy inaczej, punktem, który próbowałem uczynić, jest to, że blokowanie nie będzie wymagane w przypadku większości metod statycznych, chyba że jakiś stan współdzielony zostanie zmutowany. OP nie dostarczył wystarczających informacji na temat tego frontu i wydaje się implikować blokowanie, ponieważ jest statyczne, a nie blokowane do zarządzania państwem. –

Odpowiedz

31

To jest moje podejście, aby nie używać metod statycznych i klas w ramach operacji asynchronicznych - chyba że zaimplementowano pewną technikę blokowania, aby zapobiec warunkom wyścigu.

Dlaczego? Jeśli nie używasz udostępnionego stanu, nie powinno być żadnych warunków wyścigu. Rozważmy na przykład:

public static async Task<int> GetPageLength(string url) 
{ 
    string text = await new WebClient().DownloadStringTaskAsync(url); 
    return text.Length; 
} 

Jeśli zrobić mają wspólne państwo - czy jesteś w instancji metody na instancji, który jest używany przez wielu wątków - trzeba wypracować jak byś idealnie chcesz swoje działanie asynchroniczne do pracy. Kiedy już zdecydujesz, jak powinny zachowywać się różne rasy, faktyczne wdrożenie może być całkiem proste.

+0

Przeprosiny - mam na myśli metody statyczne ze stanem współdzielonym - zaktualizuję moje pytanie, aby podać przykład: –

+2

@PatrickMcCurley: W tym przypadku nie chodzi o "statyczność", z jaką problem - to "wiele wątków, które chcą używać tego samego" stan współdzielony ". Taka sytuacja może wystąpić równie łatwo w przypadku członków instancji, gdy instancje są współużytkowane w stanach. –

+1

Właściwie myśląc o twojej oryginalnej odpowiedzi zaczynam wątpić w moje zrozumienie tego, co się dzieje, gdy wywoływana jest metoda statyczna. Jeśli zmienna lokalna jest zadeklarowana w metodzie statycznej, a 2 wątki wprowadzają metodę statyczną w tym samym czasie - czy nie może to prowadzić do warunków wyścigu dla obiektu deklarowanego lokalnie? –