前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程的操作与数据绑定

多线程的操作与数据绑定

作者头像
用户2434869
发布2018-09-12 10:35:45
5550
发布2018-09-12 10:35:45
举报
文章被收录于专栏:yl 成长笔记

关于多线程的问题,一直没有弄太懂, 今天在 CodeProject 上看到一个很好的讲解多线程例子, 为增强理解,用我自己理解的方式记录下来,以便遗忘后查看。

如下图所示, 点击启动进度条后, 进度条会开始变化。

代码如下:

代码语言:javascript
复制
 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线程中, 可采用事件的形式),使得进度条的变化在另一线程中进行。

代码语言:javascript
复制
 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 来查找控件位置, 速度会快很多。

具体代码如下:

代码语言:javascript
复制
 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}"
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档