无法访问已处置的对象Datacontext asp.net 5

时间:2016-03-28 11:45:46

标签: c# entity-framework async-await asp.net-core

在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);

发生异常

2 个答案:

答案 0 :(得分:5)

由于您的DeleteItemAfterTimeAsync方法是async void,因此无法等待它,并且在您使用数据库上下文时,它已经被处理掉了。

DeleteItemAfterTimeAsync方法更改为async Taskawait

答案 1 :(得分:1)

我遇到了同样的问题。原因是我在调用堆栈中有一个更深的异步方法,而没有用'await'调用。 (在你的例子中,使用'await DeleteItemAfterTimeAsync'的方法不会被等待自己调用)

使用的DbContext是在没有等待的对象调用中注入的依赖项。我想当我没有等待异步方法时,DbContext被处理掉了。

到目前为止,您肯定已经解决了问题,但检查调用堆栈可能是个好主意!