我正在尝试在 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/