【发布时间】:2020-05-08 11:47:03
【问题描述】:
我有一个由 Blazor 组件和 Worker Service 组成的程序。我正在使用 .NET CORE 3.1
我的代码基于手动到Blazor components
在我的工作人员服务方面,我有:
public event Func<double, Task> Notify;
public double Data{ get; set; }
public async Task Update(double data)
{
if (Notify != null)
{
await Notify.Invoke(data).ConfigureAwait(false);
}
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
await Update(Data).ConfigureAwait(false);
...
await Task.Delay(1000, stoppingToken).ConfigureAwait(false);
}
}
在我的 Blazor 组件中:
@using MyNamespace
@inject WorkerService MyService
@implements IDisposable
<div>@DataToDisplay</div>
@code {
private double DataToDisplay{ get; set; }
protected override void OnInitialized()
{
MyService.Notify += OnNotify;
}
public async Task OnNotify(double data)
{
await InvokeAsync(() =>
{
DataToDisplay= data;
StateHasChanged();
});
}
public void Dispose()
{
MyService.Notify -= OnNotify;
}
}
调试后我通知,Notify 事件在 Blazor 组件中正确连接,在 OnInitialized() 方法中(我也尝试过带有 OnInitializedAsync() 的版本)但是,每次,当服务调用 Update() 方法时,在条件检查:if (Notify != null),Notify 为空。
我找不到原因。感谢您的任何建议!
【问题讨论】:
-
你的依赖注入看起来像什么? MyService 是单例吗?
-
确实如此。 Startup.cs 包含即:
services.AddSingleton<WorkerService>(); -
谁在启动服务?我想通过调用 ExecuteAsync,对吧?在不使用 ConfigureAwait 的情况下尝试您的代码...也许问题出在此处。你永远不会知道...
-
不是ConfigureAwait。我以两种方式尝试了上面的代码。拳头我没有将服务实现为托管服务。我添加了一个按钮来启动 ExecuteAsync 方法。 UI 得到了预期的更新。我把服务实现改成了托管服务,所以需要把DI注册改成
AddHostedService。这导致了一个错误,表明该服务未添加到 DI 并且组件无法注入它。也添加了一个单音。没有错误,但是 UI 没有更新,并且 Notify 为空。实际上,这样你就有了 2 个独立的服务实例。 -
当然上面的评论假设这发生了。我能够通过创建一个不同的非托管服务来完成这项工作,该服务注入到它自己的组件和托管服务中。托管服务调用注入服务的更新方法。事件的实现从托管服务转移到可注入服务。
标签: events .net-core service-worker blazor