【发布时间】:2020-11-11 21:22:39
【问题描述】:
在 asp.net 5/core 中,我想使用异步延迟从我的数据库中删除一个项目。 我正在使用 DI 在课堂上注入我的 Datacontext (db)。
我创建了以下方法:
public async void DeleteItemAfterTimeAsync(int itemId, TimeSpan timeSpan)
{
// give user time to fill out data
await Task.Delay(timeSpan);
var item = db.Items.FirstOrDefault(p => p.Id == itemId);
if (item!= null && item.Status == someStatus)
{
db.Items.Remove(item);
db.SaveChanges();
}
}
在给定时间后,该方法按计划执行,但出现异常:“无法访问已处置的对象”,这可能是因为服务因延迟而被处置。 我应该在方法中解决我的数据上下文的新实例还是应该如何解决这个问题? 有任何想法吗? 感谢您提前提供帮助。
更新:
调用方法:
await DeleteItemAfterTimeAsync(item.Id, new TimeSpan(0, 1, 0));
更新方法:
public async Task DeleteItemAfterTimeAsync(int itemId, TimeSpan timeSpan)
{
// give user time to fill out data
await Task.Delay(timeSpan);
var item = db.Items.FirstOrDefault(p => p.Id == itemId);
if (item != null && item.Status == someStatus)
{
db.Items.Remove(item);
db.SaveChanges();
}
}
db.Items.Remove(item) 发生异常;
【问题讨论】:
-
Datacontext 是如何注册的?作为瞬态?
-
你试过用
async Task代替async void吗? -
在 startup.cs: services.AddEntityFramework() .AddSqlServer().AddDbContext
(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));跨度> -
DbContext 的实例可能是每个请求创建的,因此一旦请求结束,它就会被处理掉。由于您的延迟,您尝试对已处置的对象进行操作(因为请求已经完成)
-
@Domysee 这确实有帮助。奇怪的事情:我可以毫无问题地执行 FirstOrDefault 调用,但是当我调用 db.Items.Remove(item) 时,我在输出窗口中看到 'Exception throw: 'System.ObjectDisposedException' in EntityFramework.Core.dll' 并且执行停止。 ..
标签: c# entity-framework async-await asp.net-core