我有一个Blazor服务器应用程序。
我正在使用带有依赖项注入的EF框架。在大多数情况下,它运行良好,没有错误。然而,我正在对计时器进行UI更新,我被抛出了一个
System.ObjectDisposedException:'无法访问已释放的对象。导致此错误的一个常见原因是处理通过依赖项注入解决的上下文,然后尝试在应用程序的其他地方使用相同的上下文实例。如果对上下文调用Dispose((,或者将上下文包装在using语句中,则可能会发生这种情况。如果使用依赖项注入,则应该让依赖项注入容器负责处理上下文实例。对象名称:"ApplicationDbContext"。">
这是代码,在Blazor页面上,它可以很好地加载页面,然后可能会刷新10/20,然后崩溃。
@code {
public bool Showmap;
Machine_Device Device = new Machine_Device();
[Parameter]
public string DeviceID { get; set; }
System.Threading.Timer timer;
protected override async Task OnInitializedAsync()
{
if (DeviceID != null)
{
var t = await JsonAction.GetLatest_FullData_MachineDevice(DeviceID);
Device = t;
}
timer = new System.Threading.Timer(UpdateUI, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
}
private async void UpdateUI(object state)
{
var t = await JsonAction.GetLatest_FullData_MachineDevice(DeviceID);
Device = t;
InvokeAsync(StateHasChanged);
}
在我的Startup中,我已经将AppificationDBcontext设置为Transient——我对此进行了研究。为了解决这个错误,我还将DeviceJsonActions((设置为Transient,而不是scoped。
启动
services.AddTransient<ApplicationDbContext>();
services.AddTransient<DeviceJsonActions>(); (defined as JsonAction in BlazorPage)
在DeviceJsonAction类中,其定义如下
public class DeviceJsonActions
{
private readonly ApplicationDbContext _context;
public ClaimsPrincipal SignedInIdentity { get; set; }
public DeviceJsonActions(ApplicationDbContext context)
{
_context = context;
}
有什么想法吗?
我认为它可能是在组件被处理后执行的计时器。
@implements IDisposable
....
@code {
...
void IDisposable.Dispose()
{
if(timer is not null) // C# 9.0
{
timer.Dispose();
}
}
}