WPF后台線程更新UI


 

轉載:https://www.cnblogs.com/endlesscoding/p/9314273.html

 

作者:@靜哥哥
本文為作者原創,未經博主允許,請勿轉載:https://www.cnblogs.com/endlesscoding/p/9314273.html


0、講點廢話

最近在做一個文件搜索的小軟件,當文件多時,界面會出現假死的狀況,於是乎想到另外開一個后台線程,更新界面上的ListView,但是卻出現我下面的問題。

1、后台線程問題

2年前寫過一個軟件,里面后台線程是用如下方法:

1 Thread searchFileThread = new Thread(new ThreadStart(StartSearchFile));  //搜索文件后台線程
2 searchFileThread.IsBackground = true;
3 searchFileThread.Start();

雖然我將IsBackground屬性置為true了,但是依然沒有用,界面依然卡頓,不知為何,如果有大神路過,還請大神在評論區不吝賜教。最后上網baidu,google找了個別的辦法,解決了它,效果還是很棒的。

2、解決界面假死問題

其實方法也很簡單,微軟早就想到此問題,提供了Dispather.Invoke()這一類方法。我將搜索到的文件放在lst_PaperList(這是一個Listview)中,StartSearchFile是我寫的一個搜索文件的函數,然后用如下代碼:

lst_PaperList.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(StartSearchFile));

嗯,就這么寫完了。但是這樣子寫完,好像沒有點什么技術含量,我也在網上找了個不用另外開線程,實現更UI的方法,在此也分享一下。

3、不用線程實時更新UI

我的搜索軟件中有個進度條,本來以為在循環讓ProgressBar.Value++,就能更新ProgressBar的進度,沒料到卻不能,還是想得太簡單。因此找了個不用自已開線程來更新ProgressBar.Value的方法,這個方法嚴格來講不能說沒有開線程,只是微軟給我們做了。方法如下:

Step1 定義一個委托

private delegate void UpdateUIDelegate(System.Windows.DependencyProperty dp, Object value);

Step2 使用Dispatcher.Invoke方法

這里說一下這個方法其中一個重載的作用Invoke(Delegate, DispatcherPriority, Object[] )按指定的優先級並使用指定的參數在與 Dispatcher關聯的線程上同步執行指定的委托。更多的還是自行查MSDN。代碼如下(其中pb_Search是我定義的一個進度條):

1 UpdateUIDelegate updatePbDelegate = new UpdateUIDelegate(pb_Search.SetValue);
2 
3 Dispatcher.Invoke(updatePbDelegate, System.Windows.Threading.DispatcherPriority.Background,
4                   new object[] { System.Windows.Controls.ProgressBar.ValueProperty, Convert.ToDouble(pb_Search.Value) });

完成了,就是這么簡單粗暴。上面的代碼不要生搬硬套,在適當的地方使用。

照葫蘆畫瓢,實時更新TextBlock的值

在WPF中,這個用綁定也行,但是效果可能沒有這個好。代碼如下(其中txt_SearchCount是用來顯示搜索結果個數的):

1 UpdateUIDelegate updateTbDelegate = new UpdateUIDelegate(txt_SearchCount.SetValue);
2 
3 Dispatcher.Invoke(updateTbDelegate, System.Windows.Threading.DispatcherPriority.Background,
4                   new object[] { System.Windows.Controls.TextBlock.TextProperty, Convert.ToString(lst_EPaper.Count) });


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM