如何正确执行异步Windows服务ExecuteAsync?

问题描述 投票:0回答:1

这个问题正在罢工......

c# .net-core async-await
1个回答
2
投票

您应该避免

async void
async void
适用于事件处理程序;大多数其他用法都是误用。
async Task
是没有返回值的
async
方法的自然签名。

因此,将

ListenForUdpMessages
ListenForHttpConnections
更改为
async Task
而不是
async void

这就提出了一个问题:“我应该如何处理这些任务?”。您的

ExecuteAsync
调用这两种方法;它应该对他们做点什么。
await
一次运行它们并不是一个好主意,因为您希望它们同时运行。异步并发的解决方案是使用
Task.WhenAll
,类似这样:

_logger.LogInformation("Worker running at: {RunningTime}", DateTimeOffset.Now);
var udpTask = _hubService.ListenForUdpMessages();
var httpTask = _managementService.ListenForHttpConnections();
await Task.WhenAll(udpTask, httpTask);

现在,

ExecuteAsync
中的异常处理将适用于从这些方法传播的异常。

旁注:

  • “有一个管理 UI(托管在 Windows 服务中)” - 我希望您的意思是管理 UI 连接 到 Win32 服务,并且 Win32 服务不直接提供 UI。几十年来,提供 UI 的 Win32 服务一直不受欢迎,我不确定现代版本的 Windows 是否可以实现这一点。
  • 您的 HTTP 侦听器中存在一种“具有独立工作人员的主循环”模式。我强烈推荐使用自托管 ASP.NET。如果您确实需要拥有独立工作人员的自己的主循环,那么我建议使用像我的结构化并发库之类的东西来管理工作人员,而不是仅仅将它们扔到线程池中。
© www.soinside.com 2019 - 2024. All rights reserved.