erossini / BlazorChartjs

Creates beautiful charts in Blazor using Chart.js. Library for NET6, NET7 and NET8. Source code and demo available.
https://www.puresourcecode.com/dotnet/blazor/blazor-component-for-chartjs/
MIT License
116 stars 44 forks source link

Dispose reference #45

Open gmlloves opened 1 year ago

gmlloves commented 1 year ago

Hello Enrico,

I re-create the charts on demand and I have some memory leaks because some references must be disposed (I am not an expert on this issue).

1.- moduleTask in ChartjsInterop:

  public async ValueTask DisposeAsync()
  {
      if (moduleTask.IsValueCreated)
      {
          await (await moduleTask.Value).DisposeAsync();
      }
  }

2.- JsModule and dotNetObjectRef in Chart.razor. :

protected override async Task OnAfterRenderAsync(bool firstRender)
{
    try
    {
        ...
        dotNetObjectRef?.Dispose();
        dotNetObjectRef = DotNetObjectReference.Create(Config);

        JSModule ??= new ChartJsInterop(JSRuntime);
        ....
    }
    catch (ObjectDisposedException)
    {
        // Sometimes the object reference is released but JS invoke some event.
    }
}
public async ValueTask DisposeAsync()
{
    dotNetObjectRef?.Dispose();
    dotNetObjectRef = null;

    if (JSModule is not null)
    {
         await JSModule.DisposeAsync();
        JSModule = null;
    }
}

Let me know what do you think :) Thank you, Gaston

erossini commented 1 year ago

Thank you Gaston. I'll add those suggestion in my next release. Enrico