Asp.net Blazor WeatherForecast示例如何工作?

Asp.net Blazor WeatherForecast示例如何工作?,asp.net,blazor,Asp.net,Blazor,Blazor的Hello World项目模板包括一个Weather Foreacast示例(除了计数器增量示例之外) 我玩了一下,看看幕后发生了什么。我似乎想不出来 基本上,如果我注释掉获取weather.json数据的代码行,那么我会无限期地看到“加载…”。到目前为止是有道理的。但当我在其原始状态下运行它时,我看到“正在加载…”,然后很快就会呈现数据网格。我的困惑是,“加载…”与datagrid的对比呈现在if-else语句中。这让我相信,不知何故,if-else会被计算两次(一次是在加载时,

Blazor的Hello World项目模板包括一个Weather Foreacast示例(除了计数器增量示例之外)

我玩了一下,看看幕后发生了什么。我似乎想不出来

基本上,如果我注释掉获取weather.json数据的代码行,那么我会无限期地看到“加载…”。到目前为止是有道理的。但当我在其原始状态下运行它时,我看到“正在加载…”,然后很快就会呈现数据网格。我的困惑是,“加载…”与datagrid的对比呈现在if-else语句中。这让我相信,不知何故,if-else会被计算两次(一次是在加载时,第二次是在加载数据时)

问题

我想知道这里的幕后情况:

  • if-else语句是否多次求值
  • 当网格异步不为null时,它如何计算null然后呈现网格
已解决

我找到了答案。 我的猜测是正确的-页面确实呈现了两次。关键在于组件的生命周期。

首先调用OnInit,然后调用OnInitAsync。任何异步操作, 如果组件完成后需要重新渲染,则应 放在OnInitAsync方法中


(请注意,在FetchData.cshtml中,数据是从OnInitAsync()覆盖加载的。)

如果检查为空:

@if (forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
     //table here
}
@if(预测==null)
{
加载

} 其他的 { //这里的桌子 }
并且数据的加载是异步的。因此,当页面初始化时,预测值为空。现在加载开始(异步),完成后将填充Forecast数组。这将使其非空并显示表

我想异步是这里的关键。

当您等待一个方法(OnInitAsync)时,您将控制权让给调用代码,调用代码将继续执行其余代码,并以文本“Loading…”呈现组件。当异步方法返回时,即任务完成并且要设置新参数时,必须重新呈现控件以反映新的更改。当然,if-else语句会再次运行,产生不同的结果

这实际上与Blazor无关。这就是异步编程在C#中的工作原理。但是,ComponentBase类中的代码检查此条件,并通过调用StateHasChanged方法决定何时重新呈现组件

请参阅ComponentBase.SetParameters和ComponentBase.ContinueAfterLifecycleTask以更好地理解它:


希望这有助于

我明白。但也许我不明白异步魔法是如何工作的。if-else条件的计算是否不止一次?我相信完成时的异步调用会在内部抛出一种StateHasChanged()事件,这将使页面重新计算内容。因此,yes.async基本上意味着代码在另一个线程上执行,并且可以与正在执行的其他代码同时执行。据我所知