You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI应用使用IMemoryCache遇缓存值丢失:获取结果为Null

问题原因及解决办法

问题原因

  1. 服务容器实例不一致:你在Program中手动调用BuildServiceProvider()创建了一个临时服务容器,这个容器和MAUI应用最终运行时使用的服务容器是完全独立的两个实例。你给临时容器里的IMemoryCache设置的值,和后续在MainActivity、ViewModel中获取的IMemoryCache不是同一个对象,自然读不到数据。
  2. 生命周期时机问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:41:19