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

Cyr*_*rom 1 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在给定时间之后,该方法按计划执行,但我得到一个例外:'无法访问已处置的对象',这可能是因为服务因延迟而被处理.我应该在方法中解析我的datacontext的新实例,或者我该如何解决这个问题?有任何想法吗?感谢您提前帮忙.

更新:

调用方法:

await DeleteItemAfterTimeAsync(item.Id, new TimeSpan(0, 1, 0));
Run Code Online (Sandbox Code Playgroud)

更新方法:

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();
   }    
}
Run Code Online (Sandbox Code Playgroud)

db.Items.Remove(item)发生异常;

Pau*_*ado 5

因为您的DeleteItemAfterTimeAsync方法是a async void,所以无法等待它,并且在您使用db上下文时,它已经被处理掉了.

DeleteItemAfterTimeAsync方法更改为async Taskawait.