C# 状态已更改首次未检测到更改

C# 状态已更改首次未检测到更改,c#,rendering,blazor,C#,Rendering,Blazor,似乎statehaschange()仅在对任务(已找到)执行等待操作后触发组件的重新呈现 因此,我只想使用StateHasChanged进行重新渲染,而不是使用Task.delay或Task.Run 这是我的密码: protected async Task ClearSearch() { SearchTestCoupon = new Mechanic.Shared.TestCouponSearch(); IsBusy = true;

似乎
statehaschange()
仅在对任务(已找到)执行等待操作后触发组件的重新呈现

因此,我只想使用
StateHasChanged
进行重新渲染,而不是使用
Task.delay
Task.Run

这是我的密码:

protected async Task ClearSearch()
        {
            SearchTestCoupon = new Mechanic.Shared.TestCouponSearch();
            IsBusy = true;
            TestCouponGroups = new List<Mechanic.Shared.TestCouponGroup>();
            StateHasChanged();  // << -------- **FIRST TIME** 
            //await Task.Delay(TimeSpan.FromSeconds(1));
            await GetTestCouponGroups(SearchTestCoupon);
        }

 protected async Task GetTestCouponGroups(object args)
        {
                TestCouponGroups = await TestCouponService.GetTestCouponGroupsAsync(SearchTestCoupon);
                IsRowSelected = false;
                IsBusy = false;
                StateHasChanged(); // << -------- **SECOND TIME**
        }
受保护的异步任务ClearSearch()
{
SearchTest优惠券=new-mechanical.Shared.TestCouponSearch();
IsBusy=true;
TestCouponGroups=新列表();

StateHasChanged();//
StateHasChanged
不重新呈现组件,组件在事件委托(
OnClick,OnMouseMouve…
)完成时重新呈现

因此,在您的情况下,如果要在第一个
状态hasChanged
上重新渲染组件,您的代码应该是:

protectedvoid ClearSearch()
{
SearchTest优惠券=new-mechanical.Shared.TestCouponSearch();
IsBusy=true;
TestCouponGroups=新列表();
GetTestCouponGroups(SearchTest优惠券);//不要等待

StateHasChanged();//我也提出了这个问题。你的问题是一样的,但你不喜欢答案?我不想使用Task.Delay或Task.Run,正如我在问题中提到的那样。它对我有效!但我仍然使用异步方法,我应该调用wait来获得该方法。所以我不明白那里发生了什么,但它有效。你能在回答中解释一下吗?因为组件在退出该方法时正在渲染。如果等待,则在
GetTestCouponGroups
完成后将重新渲染该组件。