Blazor 服务器范围的服务、关闭的连接、垃圾回收

Posted

技术标签:

【中文标题】Blazor 服务器范围的服务、关闭的连接、垃圾回收【英文标题】:Blazor-server scoped services, closed connections, garbage collection 【发布时间】:2021-04-12 15:17:21 【问题描述】:

如果我有范围服务:

services.AddSingleton<MyScopedService>();

在该服务中,发出一个 HTTP 请求:

HttpClient client = _clientFactory.CreateClient();
StringContent formData = ...;
HttpResponseMessage response = await client.PostAsync(uri, formData);
string data = await response.Content.ReadAsStringAsync();

我读到here,对于AddScoped 服务,服务范围是SignalR 连接。

如果用户在返回 response 之前关闭浏览器选项卡,MyScopedService 代码仍会完成。

有人能解释一下那个 MyScopedService 实例会发生什么吗?什么时候被认为超出范围?代码完成后?垃圾回收的时间是否可预测?

我有一个使用范围依赖注入(fluxor 和 CircuitHandler)的 Blazor 服务器项目,我注意到应用程序总内存随着每个新连接而增加(显然),但需要一段时间(分钟)关闭浏览器选项卡后内存会减少。

只是想知道这是否是预期的,或者我是否可以做一些事情来让内存使用量更快地恢复。或者我的作用域服务有问题。

【问题讨论】:

是的,这是意料之中的……您遇到的情况是正常的。 “如果我可以做一些事情来让内存使用恢复得更快”。不,不要做任何事情......内存分配会增长,直到没有可用的内存,这将迫使 GC 运行并清理...... 您是否正在处理集线器连接?我以前见过这个。通过将 IDisposable 或 IDisposableAsync 添加到您的服务来处理集线器连接。 你的服务是一个单例,它根本没有作用域。 【参考方案1】:

IDisposeAsync 添加到您的服务中,然后在您的服务中:

public async ValueTask DisposeAsync() => await hubConnection.DisposeAsync();

这是从我自己的一个库中复制的,我遇到了同样的问题。如果存在对其他对象的引用,GC 将不起作用...

【讨论】:

以上是关于Blazor 服务器范围的服务、关闭的连接、垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章

在 Blazor 服务器中使用数据库上下文工厂

服务器端 Blazor 与 MVC [关闭]

Android - 客户端关闭连接发送图像,然后接收回字符串

Blazor Server 每次使用的连接数受浏览器限制

Radzen Blazor 对话框未关闭

IIS 回收应用程序池时如何保持 Blazor 服务器连接处于活动状态