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

MudBlazor MudDialog未正确释放内存/资源引发内存泄漏问题求助

MudBlazor MudDialog未正确释放内存/资源引发内存泄漏问题求助

各位大佬好,我最近在Blazor项目里用MudBlazor的MudDialog遇到了棘手的内存泄漏问题,折腾了好一阵没找到根源,想请大家帮忙分析下!

问题背景

我维护着一个中等规模的Blazor应用,其中有个表格组件,点击行内按钮会通过MudDialog打开对应行的详情视图。这个对话框会从API加载数据展示,重点是还会加载音频文件,转成base64格式给内嵌的HTML音频播放器使用。

本来加载大音频占内存是正常场景,但现在的核心问题是:每次打开对话框都会分配新内存,关闭后这些内存完全没被释放!从堆快照能看到,对话框的实例一直在内存里堆积,打开次数多了(尤其是带大音频的对话框),直接就会导致内存溢出崩溃。

关键代码片段

我贴几个核心代码片段,方便大家排查:

Parent.razor(对话框调用方)

@inject IDialogService DialogService

private readonly DialogOptions _dialogOptions = new() { 
    MaxWidth = MaxWidth.Medium, 
    FullWidth = true, 
    CloseButton = true, 
    CloseOnEscapeKey = true, 
    NoHeader = false 
};

private async Task OpenDialogViewAsync(int id, string name)
{
    JsonDocument text = await GetText(textId);
    var parameters = new DialogParameters
    {
        { "name", name},
        { "jsonContent", text},
        { "id", transcriptionId}
    };
    var completeTitle = $"File: {name}";

    var dialog = await DialogService.ShowAsync<TextViewDialog>(completeTitle, parameters, _dialogOptions);
    var result = await dialog.Result;
}

TextViewDialog.razor(对话框组件)

@implements IDisposable

private string audioUrl = string.Empty;

protected override async Task OnInitializedAsync()
{
    _loading = true;
    await PerformSearch();
    _loading = false;
    await LoadAudioUrl();
    StateHasChanged();
}

private async Task LoadAudioUrl()
{
    try
    {
        audioBytes = await getAudio(id);
        if (audioBytes != null && audioBytes.Length > 0)
        {
            audioUrl = $"data:audio/mpeg;base64,{Convert.ToBase64String(audioBytes)}";
            Logger.LogInformation("Audio URL set successfully.");
        }
        else
        {
            Logger.LogWarning("Audio file is empty or null.");
        }
    }
    catch (Exception ex)
    {
        Logger.LogError(ex, "Error loading audio URL");
        Snackbar.Add($"Error loading audio URL: {ex.Message}", MudBlazor.Severity.Error);
    }
    StateHasChanged();
}

private void Close()
{
    Dispose();
    MudDialog.Close(DialogResult.Ok(true));
}

// 我尝试实现的Dispose方法
public void Dispose()
{
    JSRuntime.InvokeVoidAsync("disposeAudioPlayer");
    JsonContent = null;
    TextContent = null;
    audioBytes = null;
}

已尝试的方案

我已经在对话框组件里实现了IDisposable接口,在Dispose方法里手动置空了所有大对象(比如JsonContent、audioBytes),还通过JS互调尝试销毁音频播放器,但完全没用——内存还是一直在涨,对话框实例依旧堆在内存里没被回收。

我查了MudBlazor的官方文档,说对话框关闭后会自动调用Dispose,但从堆快照来看根本没生效。现在我怀疑要么是我代码写法有问题,导致对话框实例被意外引用没被GC回收;要么是MudBlazor的DialogService本身存在内存泄漏的问题?

有没有大佬遇到过类似的问题?或者能帮我看看代码里哪里可能没处理好,导致内存释放不了的?

备注:内容来源于stack exchange,提问作者Dingus Pingus IV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:29:34