






















Install-Package System.Management
private string GetGPUMem() { StringBuilder builder = new StringBuilder(); ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from win32_videocontroller"); foreach (var obj in searcher.Get()) { builder.Append($"Name:{obj["Name"]}"); //builder.Append($",status {obj["Status"]}"); //builder.Append($",driver version:{obj["DriverVersion"]}"); builder.Append($",display mem:{obj["AdapterRAM"]}"); builder.Append($",driver date:{obj["DriverDate"]}"); } return builder.ToString(); }
202604082107516926,loaded 294000000 items,memory:21,024.00 M,time cost:290.7791088 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000 The thread 3224 has exited with code 0 (0x0). 202604082107527619,loaded 295000000 items,memory:21,149.00 M,time cost:291.8483797 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000 The thread 1112 has exited with code 0 (0x0). 202604082107537398,loaded 296000000 items,memory:21,201.00 M,time cost:292.8262953 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000 The thread 23304 has exited with code 0 (0x0). 202604082107547409,loaded 297000000 items,memory:21,253.00 M,time cost:293.8274284 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000 The thread 8764 has exited with code 0 (0x0). 202604082107557737,loaded 298000000 items,memory:21,304.00 M,time cost:294.8604202 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000 The thread 24804 has exited with code 0 (0x0). 202604082107566268,loaded 299000000 items,memory:21,360.00 M,time cost:295.7134062 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000 The thread 8944 has exited with code 0 (0x0). 202604082107574839,loaded 300000000 items,memory:21,414.00 M,time cost:296.5706395 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000 The thread 8964 has exited with code 0 (0x0). 202604082107575545,loaded 300000001 items,memory:21,414.00 M,time cost:296.6428691 seconds,Name:Intel(R) Iris(R) Xe Graphics,display mem:2147479552,driver date:20250916000000.000000-000Name:NVIDIA GeForce RTX 3060 Laptop GPU,display mem:4293918720,driver date:20251118000000.000000-000 The thread '.NET TP Worker' (2856) has exited with code 0 (0x0).

<Window x:Class="WpfApp13.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp13" mc:Ignorable="d" WindowState="Maximized" Title="{Binding MainTitle}" Height="450" Width="800"> <Window.DataContext> <local:MainVM/> </Window.DataContext> <Window.Resources> <local:ImgConverter x:Key="ImgConverter"/> </Window.Resources> <Grid> <ItemsControl ItemsSource="{Binding ImgsCollection}"> <ItemsControl.Template> <ControlTemplate> <ScrollViewer CanContentScroll="True"> <VirtualizingStackPanel IsItemsHost="True" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.CacheLength="2,2" VirtualizingPanel.CacheLengthUnit="Item" VirtualizingPanel.VirtualizationMode="Recycling" ScrollViewer.CanContentScroll="True" ScrollViewer.IsDeferredScrollingEnabled="True"/> </ScrollViewer> </ControlTemplate> </ItemsControl.Template> <ItemsControl.ItemTemplate> <DataTemplate> <Grid Width="{x:Static SystemParameters.FullPrimaryScreenWidth}" Height="{x:Static SystemParameters.FullPrimaryScreenHeight}"> <Grid.Resources> <Style TargetType="TextBlock"> <Setter Property="FontSize" Value="30"/> <Setter Property="HorizontalAlignment" Value="Center"/> <Setter Property="VerticalAlignment" Value="Center"/> <Style.Triggers> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="FontSize" Value="150"/> <Setter Property="Foreground" Value="Red"/> </Trigger> </Style.Triggers> </Style> </Grid.Resources> <Image Source="{Binding ImgUrl,Converter={StaticResource ImgConverter}}" Stretch="Uniform"/> <TextBlock Text="{Binding Id}"/> </Grid> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Grid> </Window> using System.Collections.ObjectModel; using System.ComponentModel; using System.Globalization; using System.IO; using System.Management; using System.Runtime.CompilerServices; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace WpfApp13 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } public class MainVM : INotifyPropertyChanged { DateTime startDt; public MainVM() { Task.Run(async () => { await InitImgsCollection(300000001); }); } private async Task InitImgsCollection(int cnt = 100000001) { var imgDir = @"../../../Images"; if (!Directory.Exists(imgDir)) { return; } var imgs = Directory.GetFiles(imgDir); if (imgs == null || !imgs.Any()) { return; } int imgsCnt = imgs.Count(); ImgsCollection = new ObservableCollection<ImgModel>(); List<ImgModel> imgsList = new List<ImgModel>(); startDt = DateTime.Now; for (int i = 1; i < cnt + 1; i++) { imgsList.Add(new ImgModel() { Id = i, //Name = $"Name_{i}", //ISBN = $"ISBN_{i}_{Guid.NewGuid():N}", ImgUrl = imgs[i % imgsCnt] }); if (i % 1000000 == 0) { await PopulateImgsCollectionAsync(imgsList); } } if (imgsList.Any()) { await PopulateImgsCollectionAsync(imgsList); } } private async Task PopulateImgsCollectionAsync(List<ImgModel> imgsList) { var tempList = imgsList.ToList(); imgsList.Clear(); await Application.Current.Dispatcher.InvokeAsync(() => { foreach (var img in tempList) { ImgsCollection.Add(img); } MainTitle = $"{DateTime.Now.ToString("yyyyMMddHHmmssffff")},loaded {ImgsCollection.Count} items,memory:{GetMem()},time cost:{DateTime.Now.Subtract(startDt).TotalSeconds} seconds,{GetGPUMem()}"; System.Diagnostics.Debug.WriteLine(MainTitle); }, System.Windows.Threading.DispatcherPriority.Background); } private string GetMem() { return $"{System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64 / 1024 / 1024:N2} M"; } private string GetGPUMem() { StringBuilder builder = new StringBuilder(); ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from win32_videocontroller"); foreach (var obj in searcher.Get()) { builder.Append($"Name:{obj["Name"]}"); //builder.Append($",status {obj["Status"]}"); //builder.Append($",driver version:{obj["DriverVersion"]}"); builder.Append($",display mem:{obj["AdapterRAM"]}"); builder.Append($",driver date:{obj["DriverDate"]}"); } return builder.ToString(); } private ObservableCollection<ImgModel> imgsCollection; public ObservableCollection<ImgModel> ImgsCollection { get { return imgsCollection; } set { if (value != imgsCollection) { imgsCollection = value; OnPropertyChanged(); } } } private string mainTitle = ""; public string MainTitle { get { return mainTitle; } set { if (value != mainTitle) { mainTitle = value; OnPropertyChanged(); } } } public event PropertyChangedEventHandler? PropertyChanged; private void OnPropertyChanged([CallerMemberName] string propName = "") { var handler = PropertyChanged; handler?.Invoke(this, new PropertyChangedEventArgs(propName)); } } public class ImgConverter : IValueConverter { private Dictionary<string, ImageSource> imgCache = new Dictionary<string, ImageSource>(); private readonly object objLock = new object(); public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var imgUrl = value?.ToString(); if (string.IsNullOrWhiteSpace(imgUrl) || !File.Exists(imgUrl)) { return null; } lock (objLock) { if (imgCache.TryGetValue(imgUrl, out ImageSource img)) { return img; } using (FileStream fs = new FileStream(imgUrl, FileMode.Open, FileAccess.Read)) { BitmapImage bmi = new BitmapImage(); bmi.BeginInit(); bmi.StreamSource = fs; bmi.CacheOption = BitmapCacheOption.OnLoad; bmi.EndInit(); if (bmi.CanFreeze) { bmi.Freeze(); } imgCache.TryAdd(imgUrl, bmi); return bmi; } } } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return DependencyProperty.UnsetValue; } } public class ImgModel { public int Id { get; set; } public string Name { get; set; } public string ISBN { get; set; } public string ImgUrl { get; set; } } }



此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。