多线程的操作与数据绑定
生活随笔
收集整理的這篇文章主要介紹了
多线程的操作与数据绑定
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
關于多線程的問題,一直沒有弄太懂, 今天在 CodeProject 上看到一個很好的講解多線程例子, 為增強理解,用我自己理解的方式記錄下來,以便遺忘后查看。
如下圖所示, 點擊啟動進度條后, 進度條會開始變化。
?????
代碼如下:
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 }?
?
當 End 數值大于10e6 時, 會出線界面無響應狀態,如下圖所示:
?
之所以有這種情況是因為單線程條件下, 當數值過大時候, 線程阻塞在 for 循環位置, 來不及更新界面。
要解決這個問題很簡單, 在 UI 線程外增加一個新的線程(wpf中采用dispatcher.invoke, 若不是在UI線程中, 可采用事件的形式),使得進度條的變化在另一線程中進行。
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 }?
?
另一種處理多線程的通信方式可基于事件機制進行通信, 具體如下圖所示(參考 https://www.jianshu.com/p/8faae685a468):
?
在 wpf 中, 當界面的某個值大量的變化的時候,采用綁定屬性(全局變量)的方式,免去根據 Name 來查找控件位置, 速度會快很多。
具體代碼如下:
?
?
?
1 // 類繼承 INotifyPropertyChanged, 實現并重載事件處理方法 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 // 定義一個屬性 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}"?
轉載于:https://www.cnblogs.com/yaolin1228/p/8194647.html
總結
以上是生活随笔為你收集整理的多线程的操作与数据绑定的全部內容,希望文章能夠幫你解決所遇到的問題。