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

Blazor 无法再读取ParameterView实例,因为它已过期。ParameterView只能同步读取,不能存储以用于,blazor,blazor-webassembly,Blazor,Blazor Webassembly,重写SetParametersAsync时,如果调用任何异步方法,则会得到“未处理的异常呈现组件:ParameterView实例已过期,无法再读取。ParameterView只能同步读取,不能存储以供以后使用。” 如何在SetParamatersAsync中安全地调用异步方法?我相信您正在寻找的编码模式如下所示。错误消息由渲染器生成。它传入参数视图,跟踪它,并期望它立即(同步)被使用。对象中的参数可能会在一秒钟内变得非常陈旧 在模式中,我们立即使用参数,将其应用于组件实例属性。然后我们可以在空闲

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


如何在SetParamatersAsync中安全地调用异步方法?

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

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

public异步覆盖任务SetParametersAsync(ParameterView参数)
{
parameters.SetParameterProperties(此);
等待任务。延迟(100);
wait base.SetParametersAsync(ParameterView.Empty);
}
public override Task SetParametersAsync(ParameterView参数)
{
parameters.SetParameterProperties(此);
…做事
返回base.SetParametersAsync(ParameterView.Empty);
}

这是ASPNetCore团队似乎使用的模式。您可以在。

的代码中看到它。请注意,您不应该这样做:“应用参数和属性值时的异步工作必须发生在OnParametersSetAsync生命周期事件期间。”我不确定该文档文本是否意味着这一点。在我的例子中(现实世界的问题,不是我的简化示例),我需要执行一个异步操作,根据OnParametersSetAsync之前传递到组件的状态调用服务器。它在OnParametersSetAsync内部不起作用。另外,如果异步调用在这里不适用,那么可重写的SetParametersAsync方法的目的是什么?Shaun的答案解决了这个问题,这可能也是这个方法的“目的”,即设置参数DIY。我认为很多人误解了组件和生命周期<当组件的一个或多个参数发生更改时,渲染过程将调用code>SetParametersAsync。您需要礼貌地使用快速传递的
ParameterView
对象,以便对其进行处置。之后会发生什么完全取决于组件。通常通过调用StateHasChanged来更改一些内容并将渲染片段排队。ComponentBase代码在这里。这是值得了解的。
public override async Task SetParametersAsync(ParameterView parameters)
{
    await Task.Delay(1000);

    await base.SetParametersAsync(parameters);
}