C#-优化数据更新的最佳方法
只是一个关于数据更新的简单问题。 假设我有一个名为txtBox1的文本框,我想更新名为foo的字符串变量的值 哪一个提供了最佳性能和最佳操作C#-优化数据更新的最佳方法,c#,performance,updating,C#,Performance,Updating,只是一个关于数据更新的简单问题。 假设我有一个名为txtBox1的文本框,我想更新名为foo的字符串变量的值 哪一个提供了最佳性能和最佳操作 // The lengthier code but will check if the value is the same before updating. if (foo != txtBox1.Text) foo = txtBox1.Text; 或 这实际上取决于您如何使用foo变量 如果更新foo涉及到更新应用程序的其他部分(例如通过数据绑
// The lengthier code but will check if the value is the same before updating.
if (foo != txtBox1.Text)
foo = txtBox1.Text;
或
这实际上取决于您如何使用
foo
变量
如果更新foo
涉及到更新应用程序的其他部分(例如通过数据绑定),那么是的,您应该只在必要时更新它。原始答案 警告:我搞砸了。。。这个答案适用于相反的情况,即:
txtBox1.Text = foo
这可能取决于您使用的文本框 在微软的.NET框架中,我还没有审查过所有使用该名称的类别。但是我可以告诉
System.Windows.Forms.TextBox
检查是在内部完成的,所以自己做是一种浪费。其他人可能就是这样
新答案 注意:这是基于评论的编辑。当然,我们的目标是跟踪texbox的修改,并且我们正在使用windows窗体或类似的dektop窗体解决方案(可能是WinForms、WPF、GTK#等)
如果您需要每个值…
TextChanged
是一种方法,如果您希望在其中提供文本框中的每个值的日志或撤消功能,则可以使用该方法
但是请注意,事件运行在与文本分配相同的线程中,并且该线程应该是创建textbox的线程。这意味着,如果您导致任何类型的锁定或执行昂贵的操作,它将严重影响表单的性能,^1导致它反应缓慢,因为必须更新表单的线程在TextChanged
处理程序中很忙
^1:与下面给出的备选方案进行了大量比较
如果需要执行昂贵的操作,则应将值添加到ConcurrentQueue
(或类似)中。然后,您可以在后台运行一个异步^2操作,从中获取值并进行处理。确保向队列中添加必要的参数^3,这样昂贵的操作可能会在后台发生
^2:它不需要使用async
关键字,它可以是ThreadPool
、计时器
、专用线程
或类似的东西
^3:例如文本,以及日志中的时间。如果必须监视多个控件,还可以考虑使用POCO(PrimeDealCr对象)类或Stutt来存储所有需要保存的状态。
如果您可能错过某些值… 使用事件 使用事件更新版本号,而不是读取值 也就是说,您将保留两个整数变量:
Thead.VolatireWrite
(无需互锁
)Interlocked.Exchange
更新值,如果旧值与读取的值不同,则继续MaxValue
包装到MinValue
。不,这不会经常发生,但这不是借口
同样,在忽略一些值是可以的想法下。。。如果使用专用的
线程
,则可能需要使用WaitHandle(ManualResetEvent
或AutoResetEvent
[最好是细长的对应线程])在没有修改的情况下休眠线程,而不是使其停止(旋转等待)。然后,您将在事件中设置WaitHandle。试试看。如果您真的关心性能,那么您应该使用带有check@o_weismanCPU性能还是内存性能?@rene我很确定他/她指的是使用TextChanged事件对其进行性能测试,当文本相同时,它会跳过它。但是,它仍然会导致验证(这在我的案例中很重要)。假设文本100%相同,这仍然是一个更好的选择吗?较长的案例只是在必要时进行更新,这样当它们相同时就不会发生验证事件;是值得推荐的还是仍然是较长的情况?仅当值发生变化时才更新foo,您应该可以。在这种情况下,一直更新它会对性能造成轻微影响
txtBox1.Text = foo