我正在开发一个Blazor服务器应用程序,其中所有客户端都将有一个things
的列表,这些客户端中的任何一个都可以更新thing
,然后会触发一个回调,告诉所有客户端调用DbContext.Entry(thing).Reload()
,以便它们是最新的。这一切都很好,直到我刷新页面,然后我得到了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);
- 您可以将RefreshService修改为Scoped而非Singleton
- AddDbContextPool没有完全释放dbcontext的实例,它将实例重置为默认状态,可能是因为重置,它无法再次访问它