多线程的操作与数据绑定
關(guān)于多線程的問(wèn)題,一直沒(méi)有弄太懂, 今天在 CodeProject 上看到一個(gè)很好的講解多線程例子, 為增強(qiáng)理解,用我自己理解的方式記錄下來(lái),以便遺忘后查看。
如下圖所示, 點(diǎn)擊啟動(dòng)進(jìn)度條后, 進(jìn)度條會(huì)開(kāi)始變化。
?????
代碼如下:
1 private void btnStartProg_Click(object sender, RoutedEventArgs e) 2 { 3 startN = Convert.ToInt32(startNum.Text); 4 endN = Convert.ToInt32(endNum.Text); 5 6 progBar.Minimum = startN; 7 progBar.Maximum = endN; 8 9 for (int progValue = startN; progValue < endN; progValue++) 10 { 11 progBar.Value = progValue; 12 } 13 }?
?
當(dāng) End 數(shù)值大于10e6 時(shí), 會(huì)出線界面無(wú)響應(yīng)狀態(tài),如下圖所示:
?
之所以有這種情況是因?yàn)閱尉€程條件下, 當(dāng)數(shù)值過(guò)大時(shí)候, 線程阻塞在 for 循環(huán)位置, 來(lái)不及更新界面。
要解決這個(gè)問(wèn)題很簡(jiǎn)單, 在 UI 線程外增加一個(gè)新的線程(wpf中采用dispatcher.invoke, 若不是在UI線程中, 可采用事件的形式),使得進(jìn)度條的變化在另一線程中進(jìn)行。
1 private void btnStartProg_Click(object sender, RoutedEventArgs e) 2 { 3 startN = Convert.ToInt32(startNum.Text); 4 endN = Convert.ToInt32(endNum.Text); 5 6 progBar.Minimum = startN; 7 progBar.Maximum = endN; 8 9 System.Threading.Thread changeValueThread = new System.Threading.Thread(ChangeProgessValue); 10 changeValueThread.Start(); 12 } 13 14 private void ChangeProgessValue() 15 { 16 for (int progValue = startN; progValue < endN; progValue++) 17 { 18 Dispatcher.Invoke(() => progBar.Value = progValue); 19 } 20 }?
?
另一種處理多線程的通信方式可基于事件機(jī)制進(jìn)行通信, 具體如下圖所示(參考 https://www.jianshu.com/p/8faae685a468):
?
在 wpf 中, 當(dāng)界面的某個(gè)值大量的變化的時(shí)候,采用綁定屬性(全局變量)的方式,免去根據(jù) Name 來(lái)查找控件位置, 速度會(huì)快很多。
具體代碼如下:
?
?
?
1 // 類繼承 INotifyPropertyChanged, 實(shí)現(xiàn)并重載事件處理方法 2 public event PropertyChangedEventHandler PropertyChanged; 3 protected virtual void OnpropertyChanged(string propertyName) 4 { 5 if(this.PropertyChanged != null) 6 { 7 this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)) 8 } 9 } 10 // 定義一個(gè)屬性 11 private int currentValue; 12 public int CurrentValue 13 { 14 get {return currentValue} 15 set 16 { 17 currentValue = value; 18 OnpropertyChanged("CurrentValue"); 19 } 20 } 21 22 // 然后在 .xmal 需要改變的值得位置添加值綁定 Value = "{Binding CurrentValue}"?
轉(zhuǎn)載于:https://www.cnblogs.com/yaolin1228/p/8194647.html
總結(jié)
以上是生活随笔為你收集整理的多线程的操作与数据绑定的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。