想要在 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 ();
}
我在 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 ();
}