Mam usługę systemu Windows, która spawnuje zestaw czynności podrzędnych na osobnych wątkach i powinna zakończyć się dopiero po pomyślnym zakończeniu wszystkich tych działań. Nie wiem z góry, ile czasu może upłynąć, aby zakończyć działanie po otrzymaniu sygnału zatrzymania. Podczas OnStop(), czekam w odstępach czasu na ten sygnał zatrzymania i żądam dodatkowego czasu tak długo, jak system jest skłonny je przyznać.Co to jest bezpieczny narzut dla RequestAdditionalTime()?
Oto podstawowa struktura:
class MyService : ServiceBase
{
private CancellationTokenSource stopAllActivities;
private CountdownEvent runningActivities;
protected override void OnStart(string[] args)
{
// ... start a set of activities that signal runningActivities
// when they stop
// ... initialize runningActivities to the number of activities
}
protected override void OnStop()
{
stopAllActivities.Cancel();
while (!runningActivities.Wait(10000))
{
RequestAdditionalTime(15000); // NOTE: 5000 added for overhead
}
}
}
Podobnie jak wiele „overhead” Powinienem być dodanie w zaproszeniu RequestAdditionalTime
? Obawiam się, że żądania są kumulatywne, zamiast opierać się na momencie, w którym wykonywane jest każde wywołanie RequestAdditionalTime
. W takim przypadku dodanie narzutu może spowodować, że system ostatecznie odrzuci żądanie, ponieważ jest zbyt daleko w przyszłości. Ale jeśli nie dodaję żadnych kosztów ogólnych, moja usługa może zostać zakończona, zanim będzie mogła poprosić o kolejny blok dodatkowego czasu.