我有一个父 Razor 组件和一个子 Razor 组件,子组件有一个 EventCallback 类型的参数。如果我在等待 .InvokeAsync 之后从同步函数(使用 Task.Run)调用异步任务,则不再运行任何代码行。
父组件:
@page "/"
@inject NavigationManager navigationManager
<PageTitle>Home</PageTitle>
<Child OnChildClick="() => OnChildClick(newMessage)" />
<p>@_message</p>
@code
{
private string _message = "test";
private string newMessage = "new test";
private void OnChildClick(string message)
{
_message = message;
InvokeAsync(StateHasChanged);
}
}
子组件
<h3>Child</h3>
<MudButton OnClick="OnClick">Click me</MudButton>
@code {
[Parameter]
public EventCallback OnChildClick { get; set; }
private void OnClick()
{
Task.Run(() => OnClickDoThing());
}
private async Task OnClickDoThing()
{
await OnChildClick.InvokeAsync();
Console.WriteLine("Child clicked"); // This will not be called, why?
}
}
如您所见,我对 Console.WriteLine 进行了评论。如果我将 OnClick 函数设置为异步并仅等待 OnClickDoThing,则它可以正常工作,但在 Task.Run 中则不然。有人可以帮助我并解释这背后的原因吗?我想我对 Task.Run 的理解不够好。
Task.Run()
返回一个新的 Task
。如果没有人在更高级别等待,任务将不会继续执行第一个等待,其中 IsCompleted
为 false。这就是为什么它在一种情况下有效,而在另一种情况下无效。
您可以在控制台应用程序中尝试一下,您的依赖关系会更简单,并且您将更好地了解事情是如何工作的,或者情况可能并非如此。
免责声明:假设默认任务计划程序和其他恶作剧。