等待任务中的事件回调将退出执行代码

问题描述 投票:0回答:1

我有一个父 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 的理解不够好。

c# asp.net .net async-await task
1个回答
0
投票

Task.Run()
返回一个新的
Task
。如果没有人在更高级别等待,任务将不会继续执行第一个等待,其中
IsCompleted
为 false。这就是为什么它在一种情况下有效,而在另一种情况下无效。

您可以在控制台应用程序中尝试一下,您的依赖关系会更简单,并且您将更好地了解事情是如何工作的,或者情况可能并非如此。

免责声明:假设默认任务计划程序和其他恶作剧。

© www.soinside.com 2019 - 2024. All rights reserved.