Wywoływanie metod asynchronicznych z usługi Windows

Mam usługę Windows napisaną w języku C #, która okresowo odpala zadania w tle. Zazwyczaj w danym momencie równolegle działa kilkadziesiąt zadań związanych z I / O (pobieranie dużych plików itp.). Usługa działa na stosunkowo obciążonym serwerze WWW (na razie jest to konieczne) i myślę, że może ona przynieść ogromne korzyści w zakresie ochrony wątków w celu korzystania z asynchronicznych interfejsów API w jak największym stopniu.

Większość tej pracy jest wykonywana. Wszystkie zadania są teraz w pełni asynchroniczne (wykorzystując HttpClient itp.), Podobnie jak główna pętla zadań (z dużymi dawkami zadania.Delay). Pozostało tylko dowiedzieć się, jak poprawnie i bezpiecznie uruchomić główną pętlę z usługi OnStart. Zasadniczo jest to bardzo ostrzegany dylemat wywołania asynchronicznego z synchronizacji. Poniżej znajduje się to, co mam do tej pory (rażąco uproszczone).

w Program.cs:

static void Main(string[] args) {
    TaskScheduler.UnobservedTaskException += (sender, e) => {
        // log & alert!
        e.SetObserved();
    };
    ServiceBase.Run(new MyService());
}

w MyService.cs:

protected override void OnStart(string[] args) {
    _scheduler.StartLoopAsync(); // fire and forget! will this get me into trouble?
}

To jest to wezwanie doStartLoopAsync to mnie niepokoi. Nie mogę po prostuWait() na zwróconym zadaniu, ponieważ OnStart musi powrócić stosunkowo szybko. (Pętle zadań muszą działać w osobnym wątku).

Czy jestem objęty tak dalece, jak nieobserwowane wyjątki, umieszczając tego handlarza w Main?Czy skorzystanie z Task.Run przyniesie jakieś korzyściTask.Run(() => _scheduler.StartLoopAsync().Wait()); ?Czy powołanie byłoby korzystne?_scheduler.StartLoopAsync().ConfigureAwait(false) tutaj? (Wątpię, ponieważ nie maawait tutaj.)Czy przyniesie to korzyści?AsyncContextThread Stephena Cleary'ego w tej sytuacji? Nie widziałem żadnych przykładów użycia tej metody, a ponieważ zaczynam nieskończoną pętlę, nie wiem, czy synchronizacja z powrotem do pewnego kontekstu jest tu nawet istotna.

questionAnswers(2)

yourAnswerToTheQuestion