异步方法未按正确(预期)顺序执行

Async method is not executed in the right (expected) order

我有一个包含以下事件的组件:

    // MyComponent :
    [Parameter] public EventCallback<DataChangedEventArgs> OnTextChanged { get; set; }

    protected async void SomeMethod(ChangeEventArgs args)
    {
        DataChangedEventArgs evArg =new DataChangedEventArgs(args.value);
        Console.Writeline("1");
        await OnTextChanged.InvokeAsync(evArg);
        Items = evArg.Data; // <=== problem here: Data is always null.
        Console.Writeline("4");
    }

当我在另一个组件上使用和处理OnTextChanged事件时,我设置Data 属性 of DataChangedEventArgs:

 // AnotherComponent that uses MyComponent:
 public async void theTextChanged(DataChangedEventArgs args)
 {
      //...
      Console.Writeline("2");
      args.Data = await GetAPersonAsync(); // or some other object
      Console.Writeline("3");
 }

现在我希望 Items 设置为 PersonItems = evArg.Data 行)。但是 Data 始终为 null,这意味着在事件处理程序中对 args.Data(这是一个引用类型)所做的更改在 SomeMethod.[= 的调用方法中是不可访问的。 23=]

有人可以帮我吗?

更新: 我认为这与 async 方法有关,因为控制台结果与我预期的不同 (1,2,3,4) :

console:
1
2
4
3

您应该使用 async Task 而不是 async void。

Theodor 提供了 link to the documentation

为了给@Mister Magoo 的回答添加一些内容,我相信事件处理程序的 Blazor 代码看起来像这样(为清楚起见进行了简化):

var task = InvokeAsync(EventMethod);
StateHasChanged();
if (task.Status != TaskStatus.RanToCompletion && task.Status != TaskStatus.Canceled)
{
    await task;
    StateHasChanged();
}

如果您的 EventMethod returns 无效,InvokeAsync returns 完成 Task 一旦 EventMethod 屈服。只有一个 StateHasChanged 被调用 - if 块被跳过。在 UI 发生另一个组件 UI 更新之前,yield 之后 EventMethod 中发生的任何事情都不会反映在 UI 中。