我正在开发一个控制台 .NET Core 应用程序,它收集电子邮件数据,然后使用 Channels 异步发送这些电子邮件。
我目前正在将消费者添加为托管服务,以便它可以在后台运行,与此示例非常相似。我的问题是,这个应用程序需要运行的频率非常低,比如每周一次,如果它一次只执行 5 分钟或更少的工作,我不想让它一直运行。但是,我目前无法向托管消费者发出信号,表明我所知道的工作已完成。
我的问题是:有没有办法创建“结账分隔符”类型的任务来向消费者发出停止信号?或者有其他方法可以自动停止应用程序吗?
我正在使用.NET 8.0。
ChannelWriter
类(您在排队端使用的那个)有 a Complete
方法,您可以调用该方法来表示该通道将不再接收任何项目。
您应该在为该“批次”工作的频道添加最后一封电子邮件后立即调用此方法。
如果您将其与ReadAllAsync
侧的
ChannelReader
方法结合使用,一旦通道中没有更多项目,它应该停止迭代
IAsyncEnumerable
,并且您可以在此时退出应用程序。 您可能需要注入类似 的内容,通过调用
StopApplication
从托管服务(消费者)内部优雅地停止应用程序。