1

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

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

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

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);
}
4

3 回答 3

3

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

基本上创建一个委托并使用它来订阅/取消订阅事件。

编辑以帮助 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;
}
于 2020-02-27T11:21:10.083 回答
1

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

但是,也许实现 CircuitHandler 对象可以解决您的问题,因为它涉及电路连接的生命周期。在这里查看我的答案如何做到这一点......

于 2020-02-27T13:18:01.640 回答
0

请参阅以下示例

根据上面的链接,我制作了函数“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 ();
}
于 2020-02-27T13:34:36.363 回答