日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

多线程的操作与数据绑定

發(fā)布時(shí)間:2025/3/20 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程的操作与数据绑定 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。