2012-11-08 15 views
9

Obawiam się, że znam już odpowiedź. Mam klasę, która obsługuje wywołania usług i buforowanie. Aby uniknąć wielu wywołań do usługi z tym samym żądaniem, mogę oczywiście użyć blokady blokującej wokół bloku kodu , ale wiele z tych metod ma różne argumenty, które składają się na klucz pamięci podręcznej. Szkoda czekać, aż blok kodu blokady zostanie wykonany, gdy może to być zupełnie inny klucz pamięci podręcznej (lub wiele różnych kluczy pamięci podręcznej).C#, aby zablokować lub nie blokować

Wiem, że I może zrobić blokadę na samym kluczu w pamięci podręcznej, ale nie jest to możliwe, ponieważ ten ciąg może pojawić się w dowolnym miejscu.

Mogę więc wykonać potencjalne niepotrzebne połączenia z usługą bez blokady LUB dodać potencjalnie niepotrzebne opóźnienia w metodzie, czekając na blokadę.

Czy to są moje jedyne 2 opcje, czy jest tam jeszcze jedna?

Cheers

+3

"Aby uniknąć wielokrotnych połączeń do usługi z tym samym żądaniem, mogę oczywiście użyć blokady" - brzmi to mniej niż poprawnie. Blokada (System.Threading.Monitor.Enter/Exit) służy do oznaczenia bloku kodu, który będzie uruchamiany wyłącznie przez pojedynczy wątek tylko dla danej blokady. Nie spowoduje to, że powtarzające się połączenia znikają w magiczny sposób. Opublikuj fragment kodu, na który odpowiedź może być oparta. – Tar

+0

@ default.kramer Możesz to zrobić, ale musisz mieć słownik tych obiektów lub coś podobnego, abyś mógł go znaleźć ponownie, biorąc pod uwagę inny ciąg. Trzeba też uważać, aby logika określania, co należy blokować, nie wymaga więcej czasu/wysiłku niż samo blokowanie wszystkiego (zależy to oczywiście od konkretnych przypadków użycia). – Servy

Odpowiedz

7

Mogłabyś potencjalnie przełączyć swoje typy wokół użycie bezpiecznej klasy wątek, takie jak ConcurrentDictionary<T,U>, aby obsługiwać buforowanie. Stosowane odpowiednio zapobiegałoby to konieczności blokowania (własnego), ponieważ można polegać na drobnoziarnistym blokowaniu wbudowanym w sam proces zbierania danych.

Powiązane problemy