无法再读取 ParameterView 实例,因为它已过期。ParameterView 只能同步读取,不得存储用于

Mis*_*ook 3 blazor blazor-webassembly

覆盖 SetParametersAsync 时,如果我调用任何异步方法,则会得到“未处理的异常呈现组件:无法再读取 ParameterView 实例,因为它已过期。ParameterView 只能同步读取,不得存储以备后用。”

public override async Task SetParametersAsync(ParameterView parameters)
{
    await Task.Delay(1000);

    await base.SetParametersAsync(parameters);
}
Run Code Online (Sandbox Code Playgroud)

我们如何安全地调用 SetParamatersAsync 中的异步方法?

MrC*_*tis 6

我相信您正在寻找的编码模式如下所示。错误消息是由渲染器生成的。它在通过ParameterView,跟踪它,并期望它立即(同步)被消耗。对象中的参数在一秒钟内可能非常陈旧。

在我们parameters立即使用的模式中,将其应用于组件实例属性。然后我们可以base在闲暇时打电话,传递一个空的,ParameterView因为我们已经设置了它们。

        public async override Task SetParametersAsync(ParameterView parameters)
        {
            parameters.SetParameterProperties(this);
            await Task.Delay(100);
            await base.SetParametersAsync(ParameterView.Empty);
        }
Run Code Online (Sandbox Code Playgroud)
        public override Task SetParametersAsync(ParameterView parameters)
        {
            parameters.SetParameterProperties(this);
              ... Do things
            return base.SetParametersAsync(ParameterView.Empty);
        }
Run Code Online (Sandbox Code Playgroud)

这是 ASPNetCore 团队似乎使用的模式。您可以在InputBase 第 190 行以后的代码中看到它。