我有一个具有以下事件的组件:
// 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
的 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
(这是一种引用类型)所做的更改。>
有人可以帮我吗?
更新:我认为这与 async
方法有关,因为控制台结果与我预期的不同 (1,2,3,4):
console:
1
2
4
3
答案 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 更新发生。