簡體   English   中英

無法訪問已處理的對象 Datacontext asp.net 5

[英]cannot access a disposed object Datacontext asp.net 5

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

因為您的DeleteItemAfterTimeAsync方法是一個async void ,它不能被等待,並且在您使用 db 上下文時,它已經被釋放了。

DeleteItemAfterTimeAsync方法更改為async Taskawait它。

我有同樣的問題。 原因是我在調用堆棧中有一個更深的異步方法,它不是用“await”調用的。 (在您的示例中,不會使用 await 本身調用使用“await DeleteItemAfterTimeAsync”的方法)

使用的 DbContext 是在沒有 await 的對象調用中注入的依賴項。 我猜當我沒有等待異步方法時, DbContext 被釋放了。

現在你肯定已經解決了你的問題,但檢查調用堆棧可能是個好主意!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM