想要在 blazor 的 Dispose 函数中取消订阅异步方法

Want to unsubscribe async method inside Dispose function of blazor

我在 Blazor 中使用事件将数据从一个局部视图传递到另一个局部视图。

问题:处置不起作用,每次页面销毁并重新呈现时,它都会附加相同的事件。每当我调用事件时,它都会调用多次(局部视图销毁和重新创建的次数)

带有调用方法的事件定义代码

public event Action<long,long,bool,bool> MyEvent;
public void InVokeMyEvent(long data1,
        bool data2,long data3,bool data4) {
        MyEvent?.Invoke(data1,data2,data3, data4);
    } 

函数定义

async Task MyFunction(long data1,
        long data2,
        bool data3,
        bool data4)
{}

我在 OnInitializedAsync 函数中注册事件如下。

protected override async Task OnInitializedAsync()
{

    RGEState.MyEvent+= async (long data1,
       long data2,
       bool data3,
       bool data4) =>
   await MyFunction(data1,
        data2,
        data3,
        data4);

    await base.OnInitializedAsync();
}

现在要分离事件,我在实现 IDisposable 后在页面中执行以下代码。

public void Dispose()
{
    RGEState.MyEvent -= async (long data1,
       long data2,
       bool data3,
       bool data4) =>
   await MyFunction(data1,
        data2,
        data3,
        data4);
}

Jon Skeet 在这里回答了这个问题 How to remove a lambda event handler

基本上创建一个委托并将其用于 subscribe/unsubscribe 事件。

编辑以帮助 OP 理解

像这样 - 您需要保留对表达式的引用,以便在您取消订阅时它是同一个委托。

private Action<long,long,bool,bool> _delegate;
protected override async Task OnInitializedAsync()
{

    _delegate = async (long data1,
       long data2,
       bool data3,
       bool data4) => await MyFunction(data1,
        data2,
        data3,
        data4);

    RGEState.MyEvent += _delegate;
    await base.OnInitializedAsync();
}

public void Dispose()
{
    RGEState.MyEvent -= _delegate;
}

我不确定我是否了解问题所在。此行为是设计使然... 创建组件时,将执行 OnInitializedAsync 方法,并将事件处理程序附加到 MyEvent 事件。当组件被销毁时,事件处理程序被分离。如果您的组件被重新创建,上述过程将重复……一次又一次。您是否希望只添加一次事件处理程序?那是你要的吗 ?也许您应该以不同的方式设计您的组件。

但是,也许实现 CircuitHandler 对象可以解决您的问题,因为这涉及 Circuit 连接的生命周期。

按照上述 link 我使函数 "MyFunction" 同步并在其中调用另一个异步函数用于加载器

void MyFunction(long data1,
        long data2,
        bool data3,
        bool data4)
{
   InvokeAsync(async () => { await SecondFunction(data1, data2, data3, data4); });
}
async Task SecondFunction(long data1,
        long data2,
        bool data3,
        bool data4)
{
 isLaoder = True;
 StateHasChanged ();

/****Calling DB ***/

isLaoder = False;
StateHasChanged ();
}