触发器和处理事件异步



我目前正在开发一个.net 5 Blazor应用程序。

我使用事件将数据从一个组件传递到另一个组件。

不幸的是,我当前的逻辑是同步的,但我宁愿使用异步事件处理程序。

因此,我需要使用以下代码来处理我的事件:

Task.Run(async () => await ChangeNumbers());

是否有可能在没有Task的情况下异步处理事件。跑

  • 我的状态服务如下所示:
public class MyComponentState
{
public int MyNumber { get; set; }

// Is there a way to declare this event Action async??
public event Action OnChange;
public void DoStuff(int myNumber)
{
MyNumber = myNumber;
NotifyStateChanged();
}
private void NotifyStateChanged() => OnChange?.Invoke();
}
  • 处理状态的组件如下所示:
public class MyOtherComponentDisplay : ComponentBase, IDisposable
{
[Inject]
public MyComponentState MyComponentState { get; set; }
protected override void OnInitialized()
{
// this should all be handled async... i could use OnInitializedAsync
MyComponentState.OnChange += OnChangeHandler;
}
private void OnChangeHandler()
{
// Is there a way to handle/declare this without Task.Run(async ...) - but async right away??
Task.Run(async () => await ChangeNumbers());
}
private async Task ChangeNumbers()
{
// Some operations with MyComponentState.MyNumber async needed!!!
StateHasChanged();
}
public void Dispose()
{
MyComponentState.OnChange -= OnChangeHandler;
}
}

有没有一种方法可以异步地声明和处理事件?

你知道如何解决这个问题吗?

基本采用async void处理程序:

private async void OnChangeHandler()
{
// Is there a way to handle/declare this without Task.Run(async ...) 
// - but async right away??
// Task.Run(async () => await ChangeNumbers());
await ChangeNumbers();
await InvokeAsync(StateHasChanged);  // probably needed
}

你做事的方式对我来说很奇怪。我在Blazor不是这样做的。(也许你来自Web Forms?(

通常,自定义事件的定义如下:

MyControl.rarzor

[Parameter]
public EventCallback<SomeType> EventName{ get; set; }
@code {
someMethod (){
EventName.InvokeAsync(SomeType data);
} 
}

如果您愿意,消费控件中的处理程序可以是异步的:

MyPage.rarzor

<MyControl EventName=OnChangeHandler />
@code {
private async Task OnChangeHandler()
{
await ChangeNumbers();
}
}

相关内容

  • 没有找到相关文章

最新更新