MAUI应用使用IMemoryCache遇缓存值丢失:获取结果为Null
问题原因及解决办法
问题原因
- 服务容器实例不一致:你在Program中手动调用
BuildServiceProvider()创建了一个临时服务容器,这个容器和MAUI应用最终运行时使用的服务容器是完全独立的两个实例。你给临时容器里的IMemoryCache设置的值,和后续在MainActivity、ViewModel中获取的IMemoryCache不是同一个对象,自然读不到数据。 - 生命周期时机问题:Android的
MainActivity.OnCreate方法执行时机早于MAUI应用服务容器的完全初始化,即使后续正确初始化了缓存,在OnCreate执行时缓存值还未被设置。而ViewModel是在MAUI应用初始化完成后才被实例化的,所以能正常读取到缓存。
解决办法
第一步:修正缓存初始化方式,使用MAUI实际的服务容器
不要手动创建临时服务容器,改用MAUI启动时的正式服务容器来初始化缓存:
方式1:在Program中直接使用应用实例的服务容器
builder.Services.AddSingleton<IMemoryCache, MemoryCache>(); // 构建MAUI应用实例 var app = builder.Build(); // 获取应用实际使用的缓存实例 var cache = app.Services.GetRequiredService<IMemoryCache>(); cache.Set("key", "someValue"); await app.RunAsync();
方式2:在App的生命周期事件中初始化缓存
在App.xaml.cs中重写OnStart方法:
protected override void OnStart() { base.OnStart(); var cache = Application.Current.Services.GetRequiredService<IMemoryCache>(); cache.Set("key", "someValue"); }
第二步:在MainActivity中延迟读取缓存
由于OnCreate执行过早,需要在MAUI应用初始化完成后再读取缓存,可通过以下两种方式实现:
方式1:重写OnPostCreate方法
protected override void OnPostCreate(Bundle? savedInstanceState) { base.OnPostCreate(savedInstanceState); // 此时MAUI服务容器已完全初始化 var cache = MauiApplication.Current.Services.GetRequiredService<IMemoryCache>(); var someValue = cache.Get<string>("key"); // 在这里处理读取到的缓存值 }
方式2:订阅MAUI应用的Start事件
protected override void OnCreate(Bundle? savedInstanceState) { base.OnCreate(savedInstanceState); // 订阅应用启动完成事件 Microsoft.Maui.Controls.Application.Current.Start += (sender, args) => { var cache = MauiApplication.Current.Services.GetRequiredService<IMemoryCache>(); var someValue = cache.Get<string>("key"); // 在这里处理读取到的缓存值 }; }
内容的提问来源于stack exchange,提问作者developer9969
相关产品推荐
相关产品推荐

