Extremer Speicherverbrauch mit .Net Maui CollectionViewC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Extremer Speicherverbrauch mit .Net Maui CollectionView

Post by Anonymous »

Ich habe ein kleines Tool geschrieben, mit dem ich die Wiedergabeliste eines Radiosenders herunterladen kann, damit ich sie durchsehen kann, sehr klein und einfach, und es funktioniert. Aber aus irgendeinem Grund benötigt die App für etwas mehr als 1.000 Elemente (weniger als 3 MB Ob-Daten) fast 1,4 GB RAM. Es liegt also entweder ein Speicherverlust vor, den ich nicht sehe, ich verwende die Sammlungsansicht auf eine Weise, die ich nicht sollte, oder es gibt irgendwo anders einen Fehler (z. B. in MAUI selbst).
Meine App ist ein neues MAUI-Projekt in VS, nur die MainPage-Dateien wurden geändert, ich wollte diesen kleinen Code nicht auf mehrere Dateien verteilen. Hier ist der Code:
MainPage.xaml

Code: Select all


























MainPage.cs

Code: Select all

    public partial class SongEntry : ObservableObject
{
[BsonId]
public string Name { get; set; }

[ObservableProperty]
public int isLiked;

[RelayCommand]
private void Clicked()
{
if (isLiked == 0) IsLiked = 1;
else if (isLiked == 1) IsLiked = -1;
else IsLiked = 0;
Database.Save(this);
}

[RelayCommand]
private async void Open()
{
string uri = @"https://www.youtube.com/results?search_query=" + Name;
await BrowserOpen_Clicked(uri);
}

private async Task BrowserOpen_Clicked(string url)
{
try
{
Uri uri = new Uri(url);
await Browser.Default.OpenAsync(uri, BrowserLaunchMode.SystemPreferred);
}
catch (Exception ex)
{
// An unexpected error occurred.  No browser may be installed on the device.
}
}
}

public class WebLoader
{
public IConfiguration AngleSharpConfiguration { get; set; }
public IBrowsingContext AngleSharpContext { get; set; }

public WebLoader()
{
AngleSharpConfiguration = Configuration.Default.WithDefaultLoader();
AngleSharpContext = BrowsingContext.New(AngleSharpConfiguration);
}

public virtual async Task LoadWebpage(string url, int retries = 10)
{
IDocument document;
int counter = 0;
do
{
document = await AngleSharpContext.OpenAsync(url);
counter++;
} while (document == null || (document?.Body.ChildElementCount == 0 && counter < retries));

return document;
}

}

public class Database
{
static string dbFile = @"C:\SomePath\dbFile.db";

public static IList GetSongs()
{
IList songs;
using (var db = new LiteDatabase(dbFile))
{
songs = db.GetCollection("Entries").FindAll().ToList();
}

return songs;
}

public static void Save(IList entries)
{
using (var db = new LiteDatabase(dbFile))
{
foreach(var e in entries)
db.GetCollection("Entries").Upsert(e);
}
}
public static void Save(SongEntry entry)
{
using (var db = new LiteDatabase(dbFile))
{
db.GetCollection("Entries").Upsert(entry);
}
}
public static void Insert(SongEntry entry)
{
using (var db = new LiteDatabase(dbFile))
{
db.GetCollection("Entries").Insert(entry);
}
}

}

public partial class ViewModel : ObservableObject
{
string dbFile = @"C:\Users\Thorsten\Desktop\Ö3_Playlist_Review.db";

[ObservableProperty]
IList entries = new List();

[ObservableProperty]
bool isBusy = false;

public ViewModel()
{
Entries = Database.GetSongs();
}
~ViewModel()
{
Database.Save(Entries);
}

public async Task Parse()
{
IsBusy = true;
var loader = new WebLoader();

for (int i = 0; i < 10; i++)
{
var doc = await loader.LoadWebpage(@"https://onlineradiobox.com/at/hitradiooe3/playlist/" + i);
var list = GetSongs(doc);
foreach (var song in list)
{
if (Entries.FirstOrDefault(x => x.Name.Trim().ToLower() == song.Name.Trim().ToLower()) == null)
{
Database.Insert(song);
Entries.Add(song);
}
}
}
IsBusy = false;

}

private IList GetSongs(IDocument doc)
{
IList list = new List();

var tmp = doc.Body.GetElementsByClassName("track_history_item");
foreach (var item in tmp)
{
string name = item.Text().Trim();
var s = new SongEntry() { Name = name };
list.Add(s);
}

return list;
}

}

public partial class MainPage : ContentPage
{
public ViewModel vm { get; set; } = new ViewModel();

public MainPage()
{
BindingContext = vm;
InitializeComponent();
}

private async void OnCounterClicked(object sender, EventArgs e)
{
await vm.Parse();
}

}
Kann jemand ein Problem erkennen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post