Asp.net Blazor WeatherForecast示例如何工作?
Blazor的Hello World项目模板包括一个Weather Foreacast示例(除了计数器增量示例之外) 我玩了一下,看看幕后发生了什么。我似乎想不出来 基本上,如果我注释掉获取weather.json数据的代码行,那么我会无限期地看到“加载…”。到目前为止是有道理的。但当我在其原始状态下运行它时,我看到“正在加载…”,然后很快就会呈现数据网格。我的困惑是,“加载…”与datagrid的对比呈现在if-else语句中。这让我相信,不知何故,if-else会被计算两次(一次是在加载时,第二次是在加载数据时) 问题 我想知道这里的幕后情况:Asp.net Blazor WeatherForecast示例如何工作?,asp.net,blazor,Asp.net,Blazor,Blazor的Hello World项目模板包括一个Weather Foreacast示例(除了计数器增量示例之外) 我玩了一下,看看幕后发生了什么。我似乎想不出来 基本上,如果我注释掉获取weather.json数据的代码行,那么我会无限期地看到“加载…”。到目前为止是有道理的。但当我在其原始状态下运行它时,我看到“正在加载…”,然后很快就会呈现数据网格。我的困惑是,“加载…”与datagrid的对比呈现在if-else语句中。这让我相信,不知何故,if-else会被计算两次(一次是在加载时,
- if-else语句是否多次求值李>
- 当网格异步不为null时,它如何计算null然后呈现网格
(请注意,在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基本上意味着代码在另一个线程上执行,并且可以与正在执行的其他代码同时执行。据我所知