只是一个关于数据更新的简单问题。 假设我有一个名为 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;
答案 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
关键字,可以是ThreadPool
,Timer
,专用Thread
或类似的关键字
^ 3:例如文本,以及日志的时间。如果必须监视多个控件,您还可以考虑使用POCO(Plain Old CLR Object)类或结构来存储需要保留的所有状态。
IF 您可能会错过一些值...
使用活动
使用该事件更新版本号而不是读取值。
也就是说,您将保留两个整数变量:
当发生更改时您将增加的当前版本号。请使用Thead.VolatireWrite
(不需要Interlocked
)
从表单读取值时将更新的最后一个检查版本号(这是从异步操作完成的),并且您将用于验证最近是否有任何更新。使用Interlocked.Exchange
更新值,如果旧值与已知值不同,则继续。
注意:测试aritmetic溢出的情况,并确保将MaxValue
包裹到MinValue
。不,它不会经常发生,但这不是理由。
同样,根据可以错过某些值的想法......如果您使用专用Thread
,则可能需要使用WaitHandle(ManualResetEvent
或{{1在没有修改而不是使用nopping(旋转等待)的情况下让线程保持睡眠状态。然后,您将在事件中设置WaitHandle。