在asp.net 5 / core中,我希望使用async从我的数据库中删除一个项目。 我正在使用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();
}
}
在给定时间之后,该方法按计划执行,但我得到一个例外:“无法访问已处置的对象”,这可能是因为服务因延迟而被处理。 我应该在方法中解析我的datacontext的新实例,或者我该如何解决这个问题? 有任何想法吗? 感谢您提前帮忙。
更新:
调用方法:
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);
发生异常答案 0 :(得分:5)
由于您的DeleteItemAfterTimeAsync
方法是async void
,因此无法等待它,并且在您使用数据库上下文时,它已经被处理掉了。
将DeleteItemAfterTimeAsync
方法更改为async Task
和await
。
答案 1 :(得分:1)
我遇到了同样的问题。原因是我在调用堆栈中有一个更深的异步方法,而没有用'await'调用。 (在你的例子中,使用'await DeleteItemAfterTimeAsync'的方法不会被等待自己调用)
使用的DbContext是在没有等待的对象调用中注入的依赖项。我想当我没有等待异步方法时,DbContext被处理掉了。
到目前为止,您肯定已经解决了问题,但检查调用堆栈可能是个好主意!