【问题标题】:Async method is not executed in the right (expected) order异步方法未按正确(预期)顺序执行
【发布时间】:2021-09-15 07:23:31
【问题描述】:

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

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

 // 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,这意味着在SomeMethod 的调用方法中无法访问事件处理程序中对args.Data(这是一个引用类型)所做的更改。

谁能帮我解决这个问题?

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

console:
1
2
4
3

【问题讨论】:

  • 尝试使用异步任务而不是异步无效
  • @MisterMagoo 成功了!谢谢。请回答问题,以便我将其标记为 asnwer。我也将标题更改为更合适的标题
  • 这能回答你的问题吗? C# async/await await doesn't await
  • OnTextChanged 长什么样子?
  • 在@MisterMagoo 建议的基础上,您应该避免使用async void,因为调用async void 的问题是您甚至无法取回任务。您无法知道函数的任务何时完成。这使得调试难度增加了 10 倍。

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


【解决方案1】:

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

Theodor 提供了一个link to the documentation

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多