C# 从何处开始长时间运行(应用程序生命周期)任务
我有一个C# 从何处开始长时间运行(应用程序生命周期)任务,c#,blazor-server-side,C#,Blazor Server Side,我有一个Blazor组件(服务器端,服务器预渲染),它与后端gRPC服务进行通信,以获取有关系统中硬件状态的通知 Blazor组件无限期地轮询gRPC服务的状态更新(至少在会话的整个生命周期内) 我不确定在Blazor组件中从何处开始这项长时间运行的任务 例如,我可以这样做: // Ignore the returned Task or make StartLongTaskAsync an async void method. protected override void OnInitiali
Blazor
组件(服务器端,服务器预渲染),它与后端gRPC
服务进行通信,以获取有关系统中硬件状态的通知
Blazor
组件无限期地轮询gRPC
服务的状态更新(至少在会话的整个生命周期内)
我不确定在Blazor
组件中从何处开始这项长时间运行的任务
例如,我可以这样做:
// Ignore the returned Task or make StartLongTaskAsync an async void method.
protected override void OnInitialized( ) =>
StartLongTaskAsync( );
我总是讨厌忽略返回的任务
,尤其讨厌异步无效
我考虑过这样做:
protected override Task OnInitializedAsync( ) =>
await StartLongTaskAsync( ).ConfigureAwait( false );
但是我不认为初始化的方法是永远不会完成的
我也可以使用OnAfterRender的OnAfterRender
,但我不确定以下MS
关于此终身事件的简介:
在服务器上进行预渲染时,不会调用OnAfterRender和OnAfterRenderAsync
我仍然对此进行了测试,发现OnAfterRender
事件被调用了多次,所以我对此不确定
我还考虑添加一个debounce
计时器,该计时器将从OnInitialized
方法之一调用。计时器
处理程序将启动异步任务
。这将增加astartongstaskancy
不会从OnInitialized
调用两次的好处。async void
的缺点,但我想我无法避免
注意:
我从IDisposable
派生,以在组件Dispose
d时取消任务
,但我忽略了所有噪声
问题:
在Blazor
组件中启动myStartongTaskAsync
的最佳位置在哪里?为什么不提供一个后台服务,即使Blazor组件没有安装,也能保持运行?@DanielA.White这就是我使用gRPC
服务的目的。gRPC
服务处理TCP
与硬件通信的所有细节。当问题中的Blazor
组件初始化后,它可以轻松连接/断开与gRPC
服务的连接,并获取有关硬件的状态更新。您需要的是使服务类可用于使用gRPC服务的整个应用程序,然后通过设置超时从该组件调用该服务。该服务可以执行您可能需要的任何缓存,并实现您需要的轮询。WebSocket和Signaler是您在这里的朋友。我有一个类似的用例,并使用这种方法实现了它。blazor组件只关心它需要调用服务。@RichardBarker是的,这基本上就是我所做的。我使用自定义的类和MS
提供的gRPC
工厂包装了gRPC
客户端。然后我将其注入到Blazor
组件中。我在计时器的事件处理程序中启动流式处理
调用(忘了在本例中我没有轮询)。在应用程序启动时启动流式处理。浏览器不知道服务类(除了如何向服务器获取消息以触发服务类上的某些内容之外)。让浏览器对返回流中当前值的服务调用“get”。我将流的概念从浏览器中分离出来,并将其放在服务器上。