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
相关产品推荐
相关产品推荐

