gpt4 book ai didi

c# - 在循环中更新属性的依赖性

转载 作者:行者123 更新时间:2023-11-30 22:17:16 25 4
gpt4 key购买 nike

我有一个 foreach 循环,我在其中更新对象的属性。此属性具有我在 setter 中更新的依赖项。这似乎减慢了我的应用程序,因为依赖项需要一些时间,并且只需要在 foreach 循环之后更新一次。

不建议在循环后调用依赖的更新,因为我的代码中很多地方都用到了setter。除此之外,对象应该负责更新它的依赖关系而不是调用函数。

为清晰起见的代码示例

//anywhere else in my other classes
private Foo[] objects;

public void UpdateFoo()
{
//update propably hundrets of small objects
foreach (Foo obj in objects)
{
obj.Property = 1;
}
}

class Foo
{
private int _property;
public int Property
{
get { return _property; }
set
{
_property = value;

//Update something anywhere else
StaticBigFoo.Update();
} }
}

class StaticBigFoo
{
public static void Update()
{
//do something longer
}
}

我想知道这个场景的最佳实践是什么?

  • 我可以使用 DependencyProperty 并且它是 PropertyChanged-Callback,但这样依赖项仍会每次都更新。
  • 我考虑过使用 DispatcherPriority.Background 在 Dispatcher 中启动一些东西,并针对不同的委托(delegate)对其进行过滤(但如何?)
  • 我可以使用一些事务逻辑,但我不知道在那里使用什么。我阅读了一些关于 TransactionScope 的内容,我可以将它用于这样的事情吗?

最佳答案

您可以使用由多个 GUI 元素提供的 BeginUpdate()EndUpdate() 调用定义的部分。我的意思是类似于以下内容:

class Foo
{
private int _property;
public int Property
{
get { return _property; }
set
{
_property = value;

if(inUpdate)
propertyChanged = true;
else
//Update something anywhere else
StaticBigFoo.Update();
} }

static bool inUpdate = false;
static bool propertyChanged;
public static void BeginUpdate() { inUpdate = true; propertyChanged = false; }
public static void EndUpdate() { inUpdate = false; if(propertyChanged) StaticBigFoo.Update(); }
}

然后

Foo.BeginUpdate();    
foreach (Foo obj in objects)
{
obj.Property = 1;
}
Foo.EndUpdate();

这允许在需要时推迟更新。

关于c# - 在循环中更新属性的依赖性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16851672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com