如何从委托中解除异步函数

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

我正在开发 Blazor 服务器项目,我有一个存储库服务,我可以从中执行数据库操作,并且我有一个使用该服务的 razor 组件 X。

基本上,我想在某些操作(例如添加、更新、删除)上触发存储库服务中的事件,以通知剃刀组件 X 有新的更改。

在组件 X 中,我使用异步方法链接该事件(来自存储库服务),如果我使用以下语法执行它,则效果很好:

protected override OnInitalized()
{
    RepositoryService.SomethingChanged += async () => await AnAsynchronousMethod();
}

我的问题是,据我所知,我无法从事件中解开该异步方法:

public void Dispose()
{
    RepositoryService.SomethingChanged -= async () => await AnAsynchronousMethod();
}

将无法解开异步方法(因为匿名方法将尝试在幕后创建另一个方法)。

也许您会发现使用事件来接收更新通知是不合理的,但原因是我这样做,是因为我将该存储库服务注入到另一个组件 Y 中。 在组件 Y 中使用存储库服务所做的更改需要在实际组件 X 中生效。

有什么办法可以克服这个问题,或者有没有其他你认为更有效的方法。

c# events blazor delegates blazor-server-side
1个回答
0
投票

只需创建一个方法,以便您可以使用方法组转换而不是 lambda 表达式。我们不知道所涉及的委托类型,但如果它有效

Action
,您可能需要类似的东西:

protected override OnInitalized() =>
    RepositoryService.SomethingChanged += InitializationHandler;

public void Dispose() =>
    RepositoryService.SomethingChanged -= InitializationHandler;

// Note: async void is normally an antipattern, but it's common
// for event handlers.
private async void InitializationHandler() =>
    await AnAsynchronousMethod();
© www.soinside.com 2019 - 2024. All rights reserved.