c# - 在 Blazor (Wasm) 服务中执行异步初始化逻辑的正确方法是什么?

标签 c# dependency-injection blazor blazor-webassembly

我正在尝试在 Blazor Wasm 项目中创建连接服务单例。它使用 JS Interop 监听在线和离线事件,跟踪连接状态并使信息可供整个项目的多个组件使用。虽然以下确实有效,但调用异步函数并在构造函数中丢弃ValueTask感觉非常错误。

public class ConnectionService : IAsyncDisposable
{
    private readonly IJSRuntime JsRuntime;
    public bool IsOnline { get; set; } = true;
    public event Action ConnectionStatusChanged;

    public ConnectionService(IJSRuntime jsRuntime)
    {
        JsRuntime = jsRuntime;
        _ = Initialize();
    }

    public ValueTask Initialize()
    {
        return JsRuntime.InvokeVoidAsync("Connection.Initialize", DotNetObjectReference.Create(this));
    }

    [JSInvokable("Connection.StatusChanged")]
    public void OnJsConnectionStatusChanged(bool isOnline)
    {
        if (IsOnline == isOnline) return;
        IsOnline = isOnline;
        ConnectionStatusChanged?.Invoke();
    }

    public async ValueTask DisposeAsync()
    {
        await JsRuntime.InvokeVoidAsync("Connection.Dispose");
    }
}

但是,我正在努力寻找初始化服务的正确方法。例如,我不能这样做,因为它需要 JSRuntime 来初始化:

var connSingleton = new ConnectionService();
await connSingleton.Initialize();
builder.Services.AddSingleton<ConnectionService>(connSingleton);

最佳答案

处理这个问题的一种方法是在您的 Program.cs 中进行一些小的更改。

在您的 Program.cs 中:
更改默认的下面一行(通常是最后一行代码)

await builder.Build().RunAsync();

var host = builder.Build();

// Now get any services that need async initialization before app loads 
// and Init them
// Tasks here will prevent page rendering until completed
var connSingleton = host.Services.GetRequiredService<ConnectionService>();
await connSingleton.Initialize();

// Now we can call RunAsync to render the first page component
await host.RunAsync();

这是我为需要在应用加载之前异步初始化的 Blazor WASM 服务执行此操作的简化版本。请小心长时间运行的初始化任务。

关于c# - 在 Blazor (Wasm) 服务中执行异步初始化逻辑的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76658678/

相关文章:

C# 从 .NET 3.5 转换为 3.0

blazor - Blazor 中是否有等效于 Html.Raw 的内容?

c# - 如何截断字符串以适合容器?

java - Spring Autowiring 对象在postcontruct方法中为空

java - 如何使用 Google Guice 实现 "robot legs"用例?

java - 在 spring bean 中自动装箱

c# - Blazor WA 托管 - Azure AppService 上的 401 未经授权

blazor - "killed"页面是什么时候

c# - 在 MVC Controller 中获取上一个 Action 和 Controller 的名称

c# - WPF 动画 FPS 与 CPU 使用率 - 我是否期望太多?