我創建擴展IOrderedIEnumerable
看起來像這樣:爲什麼我遇到內存故障/在UWP/C#應用程序泄漏
internal static ObservableCollection<T> ToObservableCollection<T>(this IOrderedEnumerable<T> list)
{
var observableCollection = new ObservableCollection<T>();
foreach (var p in list)
observableCollection.Add(p);
return observableCollection;
}
另外我有一個網頁,它看起來像:
private ObservableCollection<BusStopName> _ListOfBusStopNames;
public BusStopsListPage()
{
this.InitializeComponent();
this.SetIsBackFromPageAllowed(true);
_ListOfBusStopNames = Timetable.Instance.BusStopsNames
.OrderBy(p => p.Name)
.ToObservableCollection<BusStopName>();
}
在這個頁面我有一個列表視圖,它具有約束力_ListOfBusStopNames
Timetable.Instance.BusStopsNames
有2812個條目。
當我導航到此頁面時,應用程序內存正在增長到無窮大。它看起來像(紅線是那一刻,我導航到該頁面):
我沒有任何想法是什麼。 有沒有人有任何想法?
當我改變實例構造到:
public BusStopsListPage()
{
this.InitializeComponent();
this.SetIsBackFromPageAllowed(true);
_ListOfBusStopNames = new ObservableCollection<BusStopName>();
}
一切工作不錯。另外,當我在此構造函數中手動更改List
(Timetable.Instance.BusStopsNames
)至ObservableCollection
時,它也很棒。
編輯 嗯..我試圖做一個例子如何重現它,我得到了它的解決方案。這是非常混亂,所以如果有人可以解釋爲什麼發生這種情況,將是不錯的:)
- 創建UWP APP
- 添加在MainPage.xaml中只有這個:
<Frame Name="MainFrame" />
- 在代碼隱藏地說:
this.Loaded += (s, e) => MainFrame.Navigate(typeof(BlankPage1));
- 與名
BlankPage1
創建新的空白頁面在BlankPage的景觀補充一點:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <StackPanel> <ListView ItemsSource="{x:Bind _ListOfTestClasses}"> <ListView.ItemTemplate> <DataTemplate x:DataType="local:TestClass"> <Grid> <TextBlock Text="{x:Bind Name}" /> </Grid> </DataTemplate> </ListView.ItemTemplate> </ListView> </StackPanel> </Grid>
在代碼隱藏的說:
public sealed partial class BlankPage1 : Page { private List<TestClass> _List; private ObservableCollection<TestClass> _ListOfTestClasses; public BlankPage1() { this.InitializeComponent(); GenerateTestData(); _ListOfTestClasses = _List.OrderBy(p => p.Name).ToObservableCollection<TestClass>(); } private void GenerateTestData() { _List = new List<TestClass>(); for(int i = 0; i < 2800; i++) _List.Add(new TestClass() { Id = i, Name = Guid.NewGuid().ToString() }); } } public static class Extension { public static ObservableCollection<T> ToObservableCollection<T>(this IOrderedEnumerable<T> list) { var observableCollection = new ObservableCollection<T>(); foreach (var p in list) observableCollection.Add(p); return observableCollection; } } public class TestClass { public int Id { get; set; } public string Name { get; set; } }
運行應用程序
所以..你可以看到,應用滯後,記憶會採取越來越多。而現在..試圖刪除BlankPage1
查看StackPanel
。現在運行應用程序。
隨着列表WPF創建一個強大的集合參考。通過使用ObservableCollection – Sybren
修復它我看不出你的圖形如何演示一個問題。它顯示了一個大小約爲100K的對象,與您跟蹤涉及的200MB相差甚遠。值得注意的是,.NET(以及一般的託管系統)往往需要內存。他們可能會從操作系統臨時分配大量內存,然後即使這些對象不在其周圍,請保留分配的內存,以備將其用於其他目的。如果你想得到很好的建議,你需要提供一個可靠地再現問題的良好[mcve]。 –
@PeterDuniho我更新了帖子。請檢查出來 – Niewidzialny