我在剃须刀服务器组件页面上有一个类似下面的按钮. 这样做的目的是,当按钮被单击时,该按钮将处于禁用模式,直到任务完成.这可以在其中一个页面上工作,但我无法让它在同一应用程序的其他页面上工作.该按钮确实会触发DoSearch()函数,并在完成时刷新内容,但它不会在中途self 更新.你知道为什么请这样吗?


<button type="button" class="btn btn-primary" @onclick="DoSearch" disabled="@SearchDisabled">@SearchBtnName</button>

        protected bool SearchDisabled { get; set; } = false;
        protected string SearchBtnName { get; set; } = "Search";

        protected async Task DoSearch()
        {
            SearchDisabled = true;
            SearchBtnName = "Searching ...";
            List<string> log = new();

            try
            {
                //Do some work which takes a few seconds ....
            }
            finally
            {
                SearchDisabled = false;
                SearchBtnName = "Search";
            }

        }

我try 更改我编写onClick的方式,如下所示: @onClick="@(async()=&gt;await DoSearch())"

我try 调用StateHasChanged()并等待InvokeAsync(StateHasChanged); 我也试着看看那个页面还有什么不同之处,但我想不出来.

推荐答案

您的代码将只工作IF do some workyield 率.如果它是包装在Task中的同步代码块,那么在do some work完成之前,呈现器没有线程时间来更新UI,并且您已经将状态字段设置回已完成.

引述今天另一项类似问题的答案:

调用StateHasChanged不会呈现组件.它将组件的RenderFragment放在呈现器的队列中.只有当呈现器的线程时间运行时,该队列才会[由呈现器和所呈现的组件]得到服务.

在下面的代码中,我引入了状态字段更新后的Year,以确保在该点上更新UI.

@page "/"

<PageTitle>Index</PageTitle>

<h1>Hello, world!</h1>

<div class="m-2 p-2">
    <button type="button" class="btn btn-primary" @onclick="DoSearch" disabled="@SearchDisabled">@this.SearchBtnName</button>
</div>

@code {
    protected bool SearchDisabled = false;
    protected string SearchBtnName = "Search";

    private async Task DoSearch()
    {
        SearchDisabled = true;
        SearchBtnName = "Searching ...";

        // make sure we yield to update the UI
        // Do work may be a block of synchronous wrapped in a Task!
        // Some people will suggest you do await Task.Delay(1) here Take your choice
        await Task.Yield();
        //await Task.Delay(1);

        await this.DoWork();

        SearchDisabled = false;
        SearchBtnName = "Search";
    }

    private async Task DoWork()
    {
        // emulate real async work
        await Task.Delay(2000);
    }
}

.net相关问答推荐

将Visual Studio更新到v17.9.3后,IDE关闭,dotnet.exe命令报告致命错误.内部CLR错误.(0x80131506)

ZstdNet库的问题:Src大小不正确,异常

双精度的 C++ 和 C# 十六进制值之间的差异

xunit Assert.ThrowsAsync() 不能正常工作?

为什么这两个比较有不同的结果?

.NET - WindowStyle = hidden 与 CreateNoWindow = true?

使用 .NET 在 Windows 中创建弹出式 toastr 通知

struct 中需要覆盖什么以确保平等正常运行?

如何将自定义 UserControl 显示为对话框?

如何正确停止BackgroundWorker

C#:获得完整的桌面大小?

在 ToString() 之前判断 null

关闭 Visual Studio 中所有选项卡但当前选项卡的键盘快捷键?

是否有 Linq 方法可以将单个项目添加到 IEnumerable

如何对 LINQ to XML 中的元素进行深层复制?

为什么 C# 不推断我的泛型类型?

log4net的正确使用方法(记录器命名)

如何比较泛型类型的值?

System.Array.CopyTo() 和 System.Array.Clone() 之间的区别

无法添加对 dll 的引用