我有一个问题:我们的应用程序已经发展到目前为止,因此有一个有许多EventHandlers的对象。这里的要点是,删除它们比添加它们花费更多的时间。这可以非常快地测试:
的类。
这里有一个有趣的观点: Registring需要0.1秒,而deregistring需要5分钟,并且它几乎呈指数增长。
有人有办法解决这个问题吗?我发现的唯一方法是在WeakEventHandler上解决这个问题(有缺点),但可能还有另外一个可能性。
示例:
public class ClassWithValueChangedEvent
{
public event EventHandler ValueChanged;
public ClassWithValueChangedEvent()
{
}
}
public class MainWindowViewModel
{
public MainWindowViewModel()
{
DateTime start = DateTime.Now;
var classInstance = new ClassWithValueChangedEvent();
for (int i = 0; i < 300000; i++)
{
classInstance.ValueChanged += ClassWithValueChangedOnValueChanged;
}
Debug.WriteLine($"Elapsed Time: {(DateTime.Now - start).TotalSeconds}");
start = DateTime.Now;
for (int i = 0; i < 300000; i++)
{
classInstance.ValueChanged -= ClassWithValueChangedOnValueChanged;
}
Debug.WriteLine($"Elapsed Time: {(DateTime.Now - start).TotalSeconds}");发布于 2022-04-22 09:59:25
我在使用微软的WeakEventManager<>.AddHandler()时解决了这个问题,它不会立即删除事件处理程序。这件事在本案中并不重要。
发布于 2020-09-01 16:08:50
如果我们需要删除所有事件处理程序
我要做的是在类中创建一个Unset方法,它像下面这样使ValueChanged事件处理程序无效:
public class ClassWithValueChangedEvent
{
public event EventHandler ValueChanged;
public void Unset()
{
ValueChanged = null;
}
}然后,在需要的时候,我会:
classInstance.Unset();这几乎是瞬间的。
如果需要删除单个事件处理程序,则为。
下面的过程要复杂得多,如果我需要的话,我不知道我是否会选择它。我们的想法是创建一个自定义列表并手动调用处理程序:
public class ClassWithValueChangedEvent
{
private List<EventHandler> eventHandlers = new List<EventHandler>();
public void SetEventHandler(EventHandler evt)
{
eventHandlers.Add(evt);
}
public void UnsetEventHandler(EventHandler evt)
{
eventHandlers.Remove(evt);
}
public void UnsetAll()
{
eventHandlers.Clear();
}
public void CallEventHandlers(object? sender, EventArgs e)
{
eventHandlers.All(p => { p(sender, e); return true; });
}
}然后,这个类的方法可以称为:
classInstance.SetEventHandler(ClassWithValueChangedOnValueChanged);
classInstance.CallEventHandlers(null, null);
classInstance.UnsetEventHandler(ClassWithValueChangedOnValueChanged);删除300000事件处理程序大约需要9秒,比分钟快得多。我也想,一定有更快的方法来做这样的事情。
https://stackoverflow.com/questions/63691151
复制相似问题