如何在 blazor 或 c# 中处理委托

问题描述 投票:0回答:1

下面我附上了我的 blazor 代码。

private delegate Task keyActionDelegate(KeyboardEventArgs e);
private KeyActionDelegate _keyActionDelegate;

protected override async Task OnParametersSetAsync()
{
    await base.OnParametersSetAsync();
    _keyActionDelegate = new KeyActionDelegate(keyActionHandler);
    Attributes = BaseUtils.UpdateDictionary("onkeydown", _keyActionDelegate, Attributes);
}

internal async override void ComponentDispose()
{
    base.ComponentDispose();
    _keyActionDelegate = null;
}

由于 keyActionDelegate 发生了内存泄漏。

我尝试在 ComponentDispose() 方法中将 _keyActionDelegate 变量设置为 null 值,但仍然发生内存泄漏。有没有其他方法可以避免内存泄漏?

c# .net memory-leaks blazor delegates
1个回答
0
投票
protected override async Task OnParametersSetAsync()
{
    _keyActionDelegate = keyActionHandler;  // shorter syntax

    // this is the leak
    Attributes = BaseUtils.UpdateDictionary("onkeydown", _keyActionDelegate, Attributes);
}

internal async override void ComponentDispose()
{
    base.ComponentDispose();
    _keyActionDelegate = null;  // doesn't help
   
    // you need something like this
    BaseUtils.RemoveFromDictionary("onkeydown", _keyActionDelegate);
}
© www.soinside.com 2019 - 2024. All rights reserved.