ASP.NETCore中的ChangeToken.OnChange中的异步操作
创始人
2024-09-18 13:30:22
0

在ASP.NET Core应用程序中,ChangeToken.OnChange 可以用来监测配置文件或者其它一些作用域范围内的变化。例如,我们可以通过监测配置文件的变化来自动重启应用程序。

异步操作可以提高程序性能,但是在使用 ChangeToken.OnChange 时需要注意一些问题。这是因为 ChangeToken.OnChange 是一个异步的回调函数。

为避免在应用程序重启期间发生死锁或者抛出异常等问题,我们需要确保 ChangeToken.OnChange 回调函数不会等待其他异步任务完成。

下面是一个示例:

public class SampleWorker
{
    private readonly IConfiguration _configuration;
    private readonly ILogger _logger;
    private readonly CancellationToken _cancellationToken;
    private IDisposable _changeTokenRegistration;

    public SampleWorker(
        IConfiguration configuration,
        ILogger logger,
        IHostApplicationLifetime appLifetime)
    {
        _configuration = configuration;
        _logger = logger;
        _cancellationToken = appLifetime.ApplicationStopping;
    }

    public async Task StartAsync()
    {
        _changeTokenRegistration =
            _configuration.GetReloadToken().RegisterChangeCallback(
                async state =>
                {
                    try
                    {
                        // 避免死锁或异常
                        await Task.Yield();

                        var worker = (SampleWorker)state;
                        worker._logger.LogInformation("Configuration Changed.");
                        // 在此添加要执行的方法 
                        // ...
                    }
                    catch (Exception ex)
                    {
                        // 在此添加异常处理代码
                        // ...
                    }
                    finally
                    {
                        if (!worker._cancellationToken.IsCancellationRequested)
                        {
                            // 避免死锁或异常
                            await worker.StartAsync();
                        }
                    }
                },
                this);
    }

    public async Task StopAsync()
    {
        _changeTokenRegistration?.Dispose();
        await Task.CompletedTask;
    }
}

在此示例中,我们在 ChangeToken.OnChange 回调函数中添加了 Task.Yield() 来确保回

相关内容

热门资讯

玩家必备攻略!德州透视hhpo... 玩家必备攻略!德州透视hhpoker,wpk俱乐部是做什么的,真是是真的有挂(有挂秘诀)所有人都在同...
9分钟了解!拱趴大菠萝有什么挂... 9分钟了解!拱趴大菠萝有什么挂,hhpoker免费辅助器,本来真的有挂(竟然有挂)9分钟了解!拱趴大...
每日必备!德州局透视,如何判断... 每日必备!德州局透视,如何判断wpk辅助软件的真假,真是存在有挂(有挂存在)1、下载好脚本下载之后点...
推荐十款!hhpoker智能辅... 推荐十款!hhpoker智能辅助插件,hhpoker免费透视脚本,好像是有挂(发现有挂)1、游戏颠覆...
普及知识!哈糖大菠萝有挂吗,a... 普及知识!哈糖大菠萝有挂吗,aa poker透视软件,好像真的有挂(有挂实锤)1、金币登录送、破产送...
我来教教你!wpk辅助插件,佛... 我来教教你!wpk辅助插件,佛手在线大菠萝辅助,本来存在有挂(有挂透视)运佛手在线大菠萝辅助辅助工具...
分辨真假!pokernow辅助... 分辨真假!pokernow辅助控制,wepoker好友助力码,一贯有挂(有挂分析)小薇(辅助器软件下...
最新技巧!fishpoker透... 最新技巧!fishpoker透视底牌,wpk透视辅助靠谱吗,总是是真的有挂(有挂秘笈)1、最新技巧!...
三分钟了解!wpk有作弊吗,有... 三分钟了解!wpk有作弊吗,有哪些免费的wpk作弊码,总是真的是有挂(有挂细节)在进入软件靠谱后,参...
带你了解!wpk私人局辅助是真... 带你了解!wpk私人局辅助是真的吗,sohoo辅助,总是真的是有挂(证实有挂)1、玩家可以在线上大神...