gpt4 book ai didi

c# - 更改观察到的集合时防止 self 回调

转载 作者:行者123 更新时间:2023-11-30 21:40:45 25 4
gpt4 key购买 nike

假设我有一个可观察的集合和两个想要:

  • 改变它,
  • 观察它并对状态变化使用react。

现在,如果 Client1 更改集合状态(例如:添加新项目),集合将触发“CollectionChanged”事件。由于两个客户端都注册了此事件通知,因此将执行 Client1 的处理方法。

为了避免 Client1 上的 self 回调,我取消订阅了一个事件,执行我的操作并再次订阅。这很痛苦——我必须记住,每次 Client1 接触集合时都会暂停 Client1 的订阅,这看起来就像一股难闻的气味。有没有更好的方法(设计模式、外部库)可以帮助我进行回调管理?

虽然在我的示例中我提到了 ObservableCollection 和 CollectionChanged 事件,但我相信我的问题更通用,归结为:“如何从事件回调中排除导致事件触发的实体”。

提前致谢!


问题在我的解决方案中不断重复出现,提出问题希望有人能提供帮助。

最佳答案

我前几次遇到你的问题,除了这个,我没有找到合适的解决方案。

这个想法是,当您更改集合时,您还传递了一个更改它的对象实例。

然后当 Collection 触发事件时,它也会传递引用。

因此所有观察者都可能知道哪个实例进行了更改,并检查是否相等。

这是此实现的一个基本示例:

class Program
{
private static MyCollection Collection;
private static MyCollectionModifier Modif1;
private static MyCollectionModifier Modif2;

static void Main(string[] args)
{
Collection = new MyCollection();
Modif1 = new MyCollectionModifier("Modifier 1", Collection);
Modif2 = new MyCollectionModifier("Modifier 2", Collection);

Modif1.AddItem("Test1");
Modif2.AddItem("Test2");
Console.ReadKey();
}
}

public class MyCollectionItemAddedEventArgs:EventArgs
{
public Object ChangeSource { get; set;}
public int newIndex {get;set;}
}

public delegate void MyCollectionItemAddedEventHandler(object sender, MyCollectionItemAddedEventArgs e);

public class MyCollection
{
private List<String> _myList;

public String this[int Index]
{
get { return _myList[Index]; }
}

public event MyCollectionItemAddedEventHandler ItemAdded;

public MyCollection()
{
_myList = new List<string>();
}

protected virtual void OnMyCollectionItemAdded(MyCollectionItemAddedEventArgs e)
{
if (ItemAdded != null)
ItemAdded(this, e);
}

public void AddItem(String Item, object ChangeSource = null)
{
_myList.Add(Item);
var e = new MyCollectionItemAddedEventArgs();
e.ChangeSource = ChangeSource;
e.newIndex = _myList.Count;
OnMyCollectionItemAdded(e);
}
}

public class MyCollectionModifier
{
private MyCollection _collection;
public string Name { get; set; }

public MyCollectionModifier(string Name, MyCollection Collection)
{
this.Name = Name;
_collection = Collection;
_collection.ItemAdded += Collection_ItemAdded;
}

public void AddItem(string Item)
{
_collection.AddItem(Item, this);
}

void Collection_ItemAdded(object sender, MyCollectionItemAddedEventArgs e)
{
if (e != null)
{
if (this.Equals(e.ChangeSource))
{
Console.WriteLine("{0} : I changed the collection", Name);
}
else
{
Console.WriteLine("{0} : Somebody else changed the collection", Name);
}
}

}
}

关于c# - 更改观察到的集合时防止 self 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44301985/

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