C# - 优化数据更新的最佳方式

时间:2013-12-08 13:45:28

标签: c# performance updating

只是一个关于数据更新的简单问题。 假设我有一个名为 txtBox1 的TextBox,我想更新一个名为 foo 的字符串变量的值。

哪种性能最佳且最佳?

// The lengthier code but will check if the value is the same before updating.
if (foo != txtBox1.Text)
     foo = txtBox1.Text;

// The shorter code but will update it regardless if it's the same value
foo = txtBox1.Text;

2 个答案:

答案 0 :(得分:3)

这实际上取决于您对foo变量的处理方式。

如果更新foo涉及更新应用程序的其他部分(例如通过数据绑定),那么是,您应该只在必要时更新它。

答案 1 :(得分:1)


原始答案

警告:我搞砸了...这个答案适用于相反的情况,即:

txtBox1.Text = foo

这可能取决于你正在使用的TextBox ......

我没有在Microsoft的.NET框架中查看过具有该名称的所有文章。但我可以告诉System.Windows.Forms.TextBox检查是在内部完成的,所以自己动手做是浪费。其他人可能就是这种情况。


新答案

注意:这是基于评论的编辑。它取而代之的是目标是跟踪texbox的修改,我们正在使用Windows窗体或类似的dektop表单解决方案(可能是WinForms,WPF,GTK#等等。)。


IF 您需要每一个价值......

TextChanged是您想要提供文本框所在的每个值的日志或撤消功能的方法。

虽然请注意事件在与分配文本的线程相同的线程中运行,并且该线程应该是创建文本框的线程。这意味着如果您导致任何类型的锁定或执行昂贵的操作,它将严重 ^ 1影响表单的性能,导致它反应缓慢,因为必须更新表单的线程忙TextChanged处理程序。

^ 1:严重与下面提供的替代方案相比。

如果您需要执行昂贵的操作,您应该将值添加到ConcurrentQueue<T>(或类似)。然后,您可以在后台运行 async ^ 2操作,从中获取值并处理它们。确保将必要的参数^ 3添加到队列中,这样可以在后台进行昂贵的操作。

^ 2:它不需要使用async关键字,可以是ThreadPoolTimer,专用Thread或类似的关键字

^ 3:例如文本,以及日志的时间。如果必须监视多个控件,您还可以考虑使用POCO(Plain Old CLR Object)类或结构来存储需要保留的所有状态。


IF 您可能会错过一些值...

使用活动

使用该事件更新版本号而不是读取值。

也就是说,您将保留两个整数变量:

  1. 当发生更改时您将增加的当前版本号。请使用Thead.VolatireWrite(不需要Interlocked

  2. 从表单读取值时将更新的最后一个检查版本号(这是从异步操作完成的),并且您将用于验证最近是否有任何更新。使用Interlocked.Exchange更新值,如果旧值与已知值不同,则继续。

  3. 注意:测试aritmetic溢出的情况,并确保将MaxValue包裹到MinValue。不,它不会经常发生,但这不是理由。

    同样,根据可以错过某些值的想法......如果您使用专用Thread,则可能需要使用WaitHandle(ManualResetEvent或{{1在没有修改而不是使用nopping(旋转等待)的情况下让线程保持睡眠状态。然后,您将在事件中设置WaitHandle。