向消费者发出生产者已停止生产的信号

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

我正在开发一个控制台 .NET Core 应用程序,它收集电子邮件数据,然后使用 Channels 异步发送这些电子邮件。

我目前正在将消费者添加为托管服务,以便它可以在后台运行,与此示例非常相似。我的问题是,这个应用程序需要运行的频率非常低,比如每周一次,如果它一次只执行 5 分钟或更少的工作,我不想让它一直运行。但是,我目前无法向托管消费者发出信号,表明我所知道的工作已完成。

我的问题是:有没有办法创建“结账分隔符”类型的任务来向消费者发出停止信号?或者有其他方法可以自动停止应用程序吗?

我正在使用.NET 8.0。

c# .net asynchronous channel producer-consumer
1个回答
0
投票

ChannelWriter
类(您在排队端使用的那个)有 a
Complete
方法
,您可以调用该方法来表示该通道将不再接收任何项目。

您应该在为该“批次”工作的频道添加最后一封电子邮件后立即调用此方法。

如果您将其与ReadAllAsync

侧的
ChannelReader
方法结合使用,一旦通道中没有更多项目,它应该停止迭代
IAsyncEnumerable
,并且您可以在此时退出应用程序。
您可能需要注入类似 

IHostApplicationLifetime

 的内容,通过调用 
StopApplication 从托管服务(消费者)内部优雅地停止应用程序。
    

© www.soinside.com 2019 - 2024. All rights reserved.