Экстремальное использование памяти с помощью .Net Maui CollectionViewC#

Место общения программистов C#
Ответить
Anonymous
 Экстремальное использование памяти с помощью .Net Maui CollectionView

Сообщение Anonymous »

Я написал небольшой инструмент для загрузки плейлиста радиостанций, который можно было просматривать, очень маленький и простой, и он работает. Но по какой-то причине для чуть более 1 тыс. элементов (менее 3 МБ данных) приложению требуется почти 1,4 ГБ ОЗУ. Таким образом, либо я не вижу утечки памяти, либо я использую представление коллекции не так, как мне следует, либо есть ошибка где-то еще (например, в самом MAUI).
Мое приложение представляет собой новый проект MAUI в VS, были изменены только файлы MainPage, я не хотел распространять этот небольшой код на несколько файлов. Вот код:
MainPage.xaml MainPage.cs

Код: Выделить всё

    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();
}

}
Может ли кто-нибудь увидеть проблему?


Подробнее здесь: https://stackoverflow.com/questions/761 ... ectionview
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»