Zajmuję się tworzeniem serwera gier MMORPG, podczas gdy to podejście nie jest potrzebne dla 80% funkcji serwera gry, 20% funkcji, które mogłyby z niego korzystać, stanowi 99% zasobów zastosowania."Przepustnica" funkcja
Próbuję wykonać funkcję throttled. Załóżmy, że wywołujesz ogromną funkcję lub szukasz ogromnej struktury danych dla określonych kryteriów. To wywołanie może spowodować ogromne użycie procesora.
Na przykład, ogromna funkcja, gdy jest wywoływana, wykorzystuje stałe 30% CPU przez 4 sekundy, aby zakończyć, na przykład, że przeszukujemy miliony wpisów w systemie aukcyjnym według kryteriów. Wyobraźmy sobie, że mamy 4 osoby robiące to jednocześnie. Chcę zrobić tę samą metodę, aby pobrać tylko 1% procesora lub mniej, biorąc pod uwagę może więcej niż 15-20 sekund, aby zwrócić ten sam wynik bez głodzenia sprzętu.
Do tej pory używam tej klasy.
public class AsyncLazy<T> : Lazy<Task<T>>
{
public AsyncLazy(Func<T> valueFactory) :
base(() => Task.Factory.StartNew(valueFactory)) { }
public AsyncLazy(Func<Task<T>> taskFactory) :
base(() => Task.Factory.StartNew(() => taskFactory()).Unwrap()) { }
}
Nie blokuje to podczas inicjowania wartości i nie blokuje się podczas konsumowania wartości leniwej. Jednak podczas masywnych operacji wykonanie operacji głodzi sprzęt, aby ukończyć zadanie, powodując 30% użycie procesora przez 4 sekundy. Moim celem jest dławienie połączeń przez praktycznie nieograniczoną ilość czasu, aby mogli wykonać swoje zadanie bez głodującego sprzętu.
Edytuj: Podziękowania dla Scotta Chamberlina za poprawienie mnie właściwym "żargonem". Nie szukam metody leniwie, ale szukam "Throttle" specyficznych wywołań metod.
Lazy ma określone znaczenie w języku C#, czego szukasz, to Dławienie, a nie Łazy. –
Dziękuję, nie wiedziałem o tym. Moim celem jest tutaj dławienie określonych połączeń. – Scotty
Proszę zaktualizować swoje pytanie (i jego tytuł), aby ponownie je sformułować, aby skupić się na fakcie, że chcesz ograniczyć wykonanie, a nie wykonać go leniwie. –