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).
Task.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.