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

时间:2021-07-03 22:38:10

标签: c# async-await blazor blazor-webassembly

我有一个具有以下事件的组件:

    // 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 事件时,我设置了 DataDataChangedEventArgs 属性:

 // 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 设置为 Person(行 Items = evArg.Data)。但是 Data 始终为 null,这意味着在调用方法 args.Data 中无法访问在事件处理程序中对 SomeMethod(这是一种引用类型)所做的更改。

有人可以帮我吗?

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

console:
1
2
4
3

2 个答案:

答案 0 :(得分:4)

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

西奥多提供了一个link to the documentation

答案 1 :(得分:2)

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

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

如果您的 EventMethod 返回空值,则 InvokeAsync 会在 Task 产生后立即返回完整的 EventMethod。只有一个 StateHasChanged 被调用 - if 块被跳过。产生后 EventMethod 中发生的任何事情都不会反映在 UI 中,直到另一个组件 UI 更新发生。

相关问题