异步方法未按正确(预期)顺序执行
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
设置为 Person
(Items = 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 中。
我有一个包含以下事件的组件:
// 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
设置为 Person
(Items = 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 中。