Я занимаюсь разработкой серверного приложения Blazor, в котором у всех клиентов будет список things
, любой из этих клиентов может обновить thing
, что должно затем вызвать обратный вызов, сообщающий всем клиентам о необходимости вызова DbContext.Entry(thing).Reload()
, чтобы они ' в курсе. Это прекрасно работает и работает, пока я не обновлю sh страницу, затем я получаю ошибку Cannot access a disposed object
и не могу понять, как ее обойти.
У меня есть следующие сервисы:
services.AddDbContextPool<MainDbContext>(...);
services.AddSingleton<RefreshService>();
RefreshService.cs:
public class RefreshService {
public Func<long, Task> OnRefreshThing { get; set; }
public void RefreshThing(long thingId) => OnRefreshThing?.Invoke(thingId);
}
Index.blazor:
protected override void OnInitialized() {
RefreshService.OnRefreshIssue += OnRefreshIssue;
}
private async Task OnRefreshThing(long thingId) {
// This works perfectly until I refresh the page & try to call it again
Thing thing = await MainDbContext.Things.FindAsync(thingId); // exception is thrown here
await MainDbContext.Entry(thing).ReloadAsync();
}
И вот пример того, что вызывает ошибку:
Thing thing = Things.Where(t => t.ThingId == 1);
thing.Name = "New name";
RefreshService.RefreshThing(thing.ThingId);