想要取消blazor的Dispose函数中的异步方法吗

想要取消blazor的Dispose函数中的异步方法吗,blazor,blazor-server-side,asp.net-blazor,Blazor,Blazor Server Side,Asp.net Blazor,我在Blazor中使用事件将数据从一个局部视图传递到另一个局部视图 问题:dispose不工作,每次页面销毁和重新呈现时,它都会附加相同的事件。每当我调用事件时,它都会调用多次,即部分视图被破坏和重新创建的次数 带有invoke方法的事件定义代码 public event Action<long,long,bool,bool> MyEvent; public void InVokeMyEvent(long data1, bool data2,long data3,bo

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

问题:dispose不工作,每次页面销毁和重新呈现时,它都会附加相同的事件。每当我调用事件时,它都会调用多次,即部分视图被破坏和重新创建的次数

带有invoke方法的事件定义代码

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);
    } 
我正在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在这里回答了这个问题

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

编辑以帮助OP理解

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

私人行动代表; 受保护的重写异步任务OnInitializedAsync { _委托=异步长数据1, 长数据2, 布尔数据3, bool data4=>等待MyFunctiondata1, 数据2, 数据3, 数据4; RGEState.MyEvent+=\u委托; 等待base.OnInitializedAsync; } 公共空间处置 { RGEState.MyEvent-=\u委托; }
Jon Skeet在这里回答了这个问题

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

编辑以帮助OP理解

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

私人行动代表; 受保护的重写异步任务OnInitializedAsync { _委托=异步长数据1, 长数据2, 布尔数据3, bool data4=>等待MyFunctiondata1, 数据2, 数据3, 数据4; RGEState.MyEvent+=\u委托; 等待base.OnInitializedAsync; } 公共空间处置 { RGEState.MyEvent-=\u委托; }
我不确定我是否理解问题所在。这种行为是故意的。。。创建组件时,将执行OnInitializedAsync方法,并将事件处理程序附加到MyEvent事件。当组件被销毁时,事件处理程序被分离。如果重新创建组件,将再次重复上述过程。。。一次又一次。是否希望只添加一次事件处理程序?这就是你想要的吗?也许您应该以不同的方式设计组件


然而,也许实现CircuitHandler对象可以解决您的问题,因为这涉及到电路连接的生命周期

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

然而,也许实现CircuitHandler对象可以解决您的问题,因为这涉及到电路连接的生命周期

根据上面的链接,我创建了函数MyFunction sync,并为loader调用了其中的另一个异步函数

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 ();
}
根据上面的链接,我创建了函数MyFunction sync,并为loader调用了其中的另一个异步函数

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

我知道这看起来很愚蠢,但是您的组件是否通过@implements指令实现IDisposable?是的,我已经通过@implements指令实现了IDisposable。您的事件是异步的,有什么原因吗?通常情况下,不能等待事件。此方法调用数据库以获取一些数据。我想在调用数据库时显示进程指示符loader,所以我将此方法设置为异步,通过使用布尔变量true/false和StateHasChanged方法,我可以轻松显示隐藏加载程序。我知道这看起来很愚蠢,但您的组件是否通过@implements指令实现IDisposable?是,我已经通过@Implements指令实现了IDisposable。您的事件为什么是异步的?通常情况下,不能等待事件。此方法调用数据库以获取一些数据。我想在调用数据库时显示进程指示符loader,所以我将此方法设置为异步,通过使用布尔变量true/false和StateHasChanged方法,我可以轻松显示隐藏加载程序。感谢您的回复,我也在做同样的事情,它可以用sync方法工作,但不能用Async方法工作,因为它不会在IDisposable上取消订阅事件。您上面的代码没有显示您正在这样做-也许您可以用该代码更新它?谢谢您的回复,我也在做同样的事情,使用sync方法可以很好地工作,但它不使用Async方法,因为它不会取消IDisposable上的事件。您上面的代码没有显示您正在这样做-也许您可以更新 用那个密码吗?