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

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涉及到更新应用程序的其他部分(例如通过数据绑

只是一个关于数据更新的简单问题。 假设我有一个名为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
涉及到更新应用程序的其他部分(例如通过数据绑定),那么是的,您应该只在必要时更新它。


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

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