Hallo zusammen,
ich möchte eine Website mit MudBlazor und C#.NET 9 erstellen. Auf einer der Seiten möchte ich Bilder anzeigen, die im Eventhandler OnInitializedAsync geladen werden. Um den Fall abzudecken, dass der Benutzer die Seite verlässt, habe ich eine Dispose-Methode implementiert.
Allerdings habe ich festgestellt, dass sowohl OnInitializedAsync als auch Dispose zweimal ausgeführt werden.
Konsolenausgabe:
OnInitializedAsync executed.
Dispose executed.
OnInitializedAsync executed.
Dispose executed.
Dieses Verhalten tritt nur auf, wenn Bilder angezeigt werden.
Ich frage mich, warum das passiert und wie ich unnötige Festplattenzugriffe (oder spätere Datenbankzugriffe) verhindern kann.
Ich habe bereits versucht, ein auf true gesetztes Flag _isInitialized zu verwenden, um ein zweites Dispose zu verhindern, aber Dispose wird trotzdem zweimal aufgerufen.
Ich habe auch versucht, OnAfterRenderAsync mit dem Flag _isRendered zu verwenden, aber da OnAfterRenderAsync mehrmals ausgelöst wird, ist es nicht geeignet, da die Bilder zu oft neu geladen werden.
Ich habe ein minimales, ausführbares Beispiel zur Überprüfung bereitgestellt.
Nachtrag: Auch, wenn 2× die Dispose-Methode aufgerufen wird, bleiben die Bilder sichtbar.
Razor-Seite:
Spoiler anzeigen
*Topic verschoben*
ich möchte eine Website mit MudBlazor und C#.NET 9 erstellen. Auf einer der Seiten möchte ich Bilder anzeigen, die im Eventhandler OnInitializedAsync geladen werden. Um den Fall abzudecken, dass der Benutzer die Seite verlässt, habe ich eine Dispose-Methode implementiert.
Allerdings habe ich festgestellt, dass sowohl OnInitializedAsync als auch Dispose zweimal ausgeführt werden.
Konsolenausgabe:
OnInitializedAsync executed.
Dispose executed.
OnInitializedAsync executed.
Dispose executed.
Dieses Verhalten tritt nur auf, wenn Bilder angezeigt werden.
Ich frage mich, warum das passiert und wie ich unnötige Festplattenzugriffe (oder spätere Datenbankzugriffe) verhindern kann.
Ich habe bereits versucht, ein auf true gesetztes Flag _isInitialized zu verwenden, um ein zweites Dispose zu verhindern, aber Dispose wird trotzdem zweimal aufgerufen.
Ich habe auch versucht, OnAfterRenderAsync mit dem Flag _isRendered zu verwenden, aber da OnAfterRenderAsync mehrmals ausgelöst wird, ist es nicht geeignet, da die Bilder zu oft neu geladen werden.
Ich habe ein minimales, ausführbares Beispiel zur Überprüfung bereitgestellt.
Nachtrag: Auch, wenn 2× die Dispose-Methode aufgerufen wird, bleiben die Bilder sichtbar.
Razor-Seite:
Quellcode
- @page "/"
- @using MudBlazor
- @implements IDisposable
- @inject NavigationManager Navigation
- <MudLayout>
- @if (Foos.Count > 0)
- {
- <MudGrid Class="mt-4" Spacing="0">
- @foreach (Foo f in Foos)
- {
- @if (f.ImageAsByteArray != null)
- {
- <MudItem xs="12" sm="6" md="4">
- <MudCardContent Dense="true">
- <MudImage Src="@($"data:image;base64,{Convert.ToBase64String(f.ImageAsByteArray)}")" Elevation="25" Class="rounded-lg ma-2 d-block mx-auto" Width="350" Height="350" />
- </MudCardContent>
- </MudItem>
- }
- }
- </MudGrid>
- }
- </MudLayout>
- @code {
- private List<Foo> Foos = new List<Foo>();
- protected override async Task OnInitializedAsync()
- {
- Foos = await LoadImages();
- Console.WriteLine("OnInitializedAsync executed.");
- }
- public void Dispose()
- {
- Console.WriteLine("Dispose executed.");
- foreach (Foo foo in Foos)
- {
- foo.CleanUp();
- }
- }
- private Task<List<Foo>> LoadImages()
- {
- List<Foo> foos = new List<Foo>();
- Foo foo1 = new Foo(System.IO.File.ReadAllBytes(@$"{Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)}\Pictures\20190119_131055 2.jpg"));
- foos.Add(foo1);
- Foo foo2 = new Foo(System.IO.File.ReadAllBytes(@$"{Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)}\Pictures\20210117_010401.jpg"));
- foos.Add(foo2);
- return Task.FromResult(foos);
- }
- }
*Topic verschoben*
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Bartosz“ ()