WPF 防止卡頓
<ListView>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
異步編程:
public async Task LoadDataAsync()
{
var data = await Task.Run(() => LoadDataFromDatabase());
Dispatcher.Invoke(() => UpdateUI(data));
}
優(yōu)化資源加載:
BitmapImage image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri("pack://application:,,,/Images/LargeImage.png");
image.CacheOption = BitmapCacheOption.OnLoad; // 緩存選項(xiàng)
image.CreateOptions = BitmapCreateOptions.DelayCreation; // 延遲創(chuàng)建
image.EndInit();
按鈕卡頓:
private async void button1_Click(object sender, EventArgs e)
{
await Task.Run(() =>
{
for (int i = 0; i < 200; i++)
{
Thread.Sleep(10);
label1.Text = $"{DateTime.Now.ToString("yyyy-MM-dd:mm:HH:ss.fff")} i的值為 {i}";
}
});
}
原理說明
接下來,我們詳細(xì)闡述一下原理:
BeginInvoke 方法是一個(gè)異步方法,它允許通過委托在控件的 UI 線程上異步執(zhí)行代碼,new Action() 是一個(gè)簡單的匿名方法,將會(huì)在UI線程上執(zhí)行,當(dāng)UI線程空閑時(shí),該方法將會(huì)被異步調(diào)用。
使用 BeginInvoke 的好處是,即使在執(zhí)行長時(shí)間運(yùn)行的操作時(shí),也不會(huì)阻塞 UI 線程。這意味著用戶仍然可以與應(yīng)用程序進(jìn)行交互,并且應(yīng)用程序的響應(yīng)性不會(huì)受到影響。
當(dāng)調(diào)用 BeginInvoke 時(shí),系統(tǒng)會(huì)將任務(wù)添加到 UI 線程的消息隊(duì)列中。一旦消息隊(duì)列中沒有正在執(zhí)行的任務(wù),UI 線程就會(huì)從消息隊(duì)列中獲取下一個(gè)任務(wù)并執(zhí)行它。這樣,UI 線程就可以在需要執(zhí)行的任務(wù)之間快速切換,從而保持應(yīng)用程序的響應(yīng)性和流暢性。
WPF ItemsControl 卡頓 數(shù)據(jù)量大 虛擬化 優(yōu)化:
<ItemsControl ItemsSource="{Binding MemberList}"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling"
VirtualizingPanel.CacheLength="50">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel></VirtualizingStackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
WPF 加載數(shù)據(jù)庫防止卡頓:
public async Task LoadDataAsync()
{
var data = await Task.Run(() =>
{
// 這里執(zhí)行數(shù)據(jù)庫查詢
return DbContext.YourEntities.ToList(); // 假設(shè)這是一個(gè)耗時(shí)的數(shù)據(jù)庫操作
});
// 更新UI
Dispatcher.Invoke(() =>
{
// 更新綁定的數(shù)據(jù)源等
MyDataCollection = data;
});
}
WPF頁面初始化慢的問題解決:
this.Dispatcher.Invoke(new Action(()=>{
//分批加載控件的方法
}),System.Windows.Threading.DispatcherPriority.ApplicationIdle);
參考:
WPF頻繁更新UI卡頓問題
http://www.rzrgm.cn/guchen33/p/18263124
https://blog.51cto.com/u_16126006/6334218
WPF圖片異步加載,提升UI響應(yīng)速度的7大技巧
https://wenku.csdn.net/column/3q7sich6t3

浙公網(wǎng)安備 33010602011771號