2012-01-11 35 views
1

我有通过i转换器与c绑定的DP a和b(注意a和b可能通过转换器绑定到另一个DP)。我修改a和b或它们绑定的某些DP,然后在计算中使用c。我在for循环中这样做,并且需要很长时间,条件是i=0; i<100000; i++)。所以我想知道数据绑定的效率如何?它应该用于这样的场景吗? 下面是一些示例代码:WPF数据绑定的效率如何?

 for (int i = 0; i < 100000; i++){ 
      //... code to pick m based on some random numbers 
      hazards[m].Reactant1.Count -= 1; 
      hazards[m].Reactant2.Count -= 1; 
      hazards[m].Product.Count += 2; 
      display.Text = hazards[m].Value.ToString(); 
     } 

hazards.Value经由转换器结合到反应物的数量,反应物的计数被绑定到文本框的文本属性。 m是根据危险值和一些随机数挑选出来的。

+2

听起来像你应该从模型中分离视图。看看MVVM。 – 2012-01-11 22:13:33

+1

@AvadaKedavra我知道MVVM是什么,但我不知道如何与你的答案联系起来。 – mihajlv 2012-01-11 22:17:45

+0

你可以添加一些代码吗? – 2012-01-11 22:19:54

回答

0

长时间运行的任务不应该在UI线程中运行。如果你在这里运行你的长时间运行计算,你的用户界面将会很慢 - 与数据绑定的速度无关。由于您阻止了UI的更新。

如果您在后台线程中更改值,那么您必须使用为您进行线程切换的调度程序。这又带来了开销。

在这两种方式中,你有很多因素会减慢你的应用程序。 它并没有真正说出任何可靠的数据绑定效率。

我建议你在后台线程中编写代码并检查它是否足够快。如果不使用分析器来检查你的瓶颈在哪里。

2

我在for循环中这样做,它需要很长时间,条件是i = 0;我< 100000; i ++)。所以我想知道数据绑定的效率如何?它应该用于像 这样的场景吗?

这就是问题 - 错误测试。谁在乎?如果您认为您可以在用户看到屏幕上显示100000个更新,并且您已经弄错了。另外还有一个问题,就是屏幕在紧密循环情况下如何/何时更新 - 您可能每秒钟会更新60次更新。

你不测试数据绑定开始,你测试ALSO 100.000 tostring调用。

+0

我明白了,谢谢你的解释。 – mihajlv 2012-01-11 23:16:41

1

这里的正确方法是将与模型分开。为此,使用MVVM(在网络中有很多很好的INotifyPropertyChanged实现)。当ViewModel将准备(我meen基地视图模型) - 应该实现这样的:

[视图模型]的.cs

private double _c; 
public double C 
{ 
    get { return _c; } 
    set 
    { 
     if (_c != value) 
     { 
      _c = value; 
      RaisePropertyChanged("C"); 
     } 
} 

[页]的.xaml

... 
<UserControl.Resources> 
    <vm:ViewModel /> 
    ... 
</UserControl.Resources> 
... 
<TextBox x:Name="A" Text="{Binding C, Converter={StaticResource someConverter} Mode=TwoWay}" /> 
... 
<TextBlock x:Name="B" Content="{Binding C, Mode=TwoWay}" /> 
... 

ViewModelView更改C后,它会自动(与INotifyPropertyChanged帮助)在所有的地方更新它。这意味着你不应该运行任何循环或者你之前做的任何事情。

注:从零开始,我建议使用MvvmLight

+0

有趣的想法,我会看看链接。谢谢。 – mihajlv 2012-01-11 23:14:12