Chamando métodos assíncronos de um serviço do Windows

Eu tenho um serviço do Windows escrito em C # que periodicamente dispara trabalhos em segundo plano. Normalmente, a qualquer momento, várias dúzias de tarefas fortemente vinculadas a E / S (download de arquivos grandes, etc) são executadas em paralelo. O serviço é executado em um servidor web relativamente agitado (necessário por enquanto), e eu acho que poderia se beneficiar muito em termos de conservação de thread para usar APIs assíncronas, tanto quanto possível.

A maior parte deste trabalho está concluída. Todos os trabalhos agora são totalmente assíncronos (aproveitando o HttpClient, etc.), assim como o loop de job principal (com altas doses de Task.Delay). Tudo o que resta é descobrir como acionar corretamente e com segurança o loop principal do OnStart do serviço. Essencialmente, é o tão falado dilema chamando-async-de-sincronia. Abaixo está o que eu tenho até agora (grosseiramente simplificado).

em Program.cs:

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

em MyService.cs:

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

É essa chamada paraStartLoopAsync isso me preocupa. Não posso simplesmenteWait() na Tarefa retornada porque o OnStart precisa retornar com relativa rapidez. (Os laços de trabalho precisam ser executados em um segmento separado.) Alguns pensamentos vêm à mente:

Estou bem coberto, até onde exceções não observadas, colocando esse manipulador em Main?Haveria algum benefício em usar o Task.Run, algo comoTask.Run(() => _scheduler.StartLoopAsync().Wait()); ?Haveria algum benefício em chamar_scheduler.StartLoopAsync().ConfigureAwait(false) Aqui? (Eu estou duvidando desde que não háawait Aqui.)Haveria algum benefício em usarAsyncContextThread de Stephen Cleary nesta situação? Eu não vi nenhum exemplo de uso disso e, como estou iniciando um loop infinito, não sei se a sincronização de volta para algum contexto é relevante até aqui.

questionAnswers(2)

yourAnswerToTheQuestion