我有一个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);
}在我的启动中,我已经将AppicationDBcontext设置为瞬态--我对此进行了研究。为了解决此错误,我还将DeviceJsonActions ()设置为瞬态的,而不是限定范围的。
启动
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;
}有什么想法吗?
发布于 2020-10-12 15:18:29
我认为它可能是在组件被释放后执行的计时器。
@implements IDisposable
....
@code {
...
void IDisposable.Dispose()
{
if(timer is not null) // C# 9.0
{
timer.Dispose();
}
}
}https://stackoverflow.com/questions/64318483
复制相似问题