Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从何处开始长时间运行(应用程序生命周期)任务_C#_Blazor Server Side - Fatal编程技术网

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
组件中启动my
StartongTaskAsync
的最佳位置在哪里?

为什么不提供一个后台服务,即使Blazor组件没有安装,也能保持运行?@DanielA.White这就是我使用
gRPC
服务的目的。
gRPC
服务处理
TCP
硬件通信的所有细节。当问题中的
Blazor
组件初始化后,它可以轻松连接/断开与
gRPC
服务的连接,并获取有关硬件的状态更新。您需要的是使服务类可用于使用gRPC服务的整个应用程序,然后通过设置超时从该组件调用该服务。该服务可以执行您可能需要的任何缓存,并实现您需要的轮询。WebSocket和Signaler是您在这里的朋友。我有一个类似的用例,并使用这种方法实现了它。blazor组件只关心它需要调用服务。@RichardBarker是的,这基本上就是我所做的。我使用自定义的
类和
MS
提供的
gRPC
工厂包装了
gRPC
客户端。然后我将其注入到
Blazor
组件中。我在计时器的
事件处理程序中启动
流式处理
调用(忘了在本例中我没有轮询)。在应用程序启动时启动流式处理。浏览器不知道服务类(除了如何向服务器获取消息以触发服务类上的某些内容之外)。让浏览器对返回流中当前值的服务调用“get”。我将流的概念从浏览器中分离出来,并将其放在服务器上。