Cannot access a disposed object in ASP.NET Core

  對於.neter來講,在使用ASP.NET Core的過程當中,你們或多或少會遇到這樣的報錯——「Cannot access a disposed object」。出現這樣的異常的緣由有不少,若是它在調試的時候出現是很容易解決的,可是有些時候它在本地運行良好,等到你部署到生產環境纔會表現出來。針對這個異常,請跟隨我一塊兒來分析和探究其根本緣由。html

  在ASP.NET Core開發中,我屢次遇見了這樣的報錯,而且跟蹤這個bug很艱難。這樣的報錯有多種緣由。有時僅憑其表現的「症狀」就能修復這個Bug,可是有時候又極其痛苦。經過尋找「病因」,咱們能夠反過來優化本身的代碼。git

  錯誤信息很清楚:github

Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling Dispose() on the context, or wrapping the context in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances. Object name: 'XXXContext'.typescript

常見緣由

對象已經釋放(The object is disposed in your code)微信

  最簡單的緣由是你有一個能夠釋放的對象,而後你在代碼的某個地方釋放了它。也多是你釋放了一個使用了該對象的對象。當你試圖訪問一個被釋放的對象時,就引起了該異常。此時,你要作的就是查看該範圍的代碼路徑,或者上下文調用關係,經過打斷點來排查該問題。app

代碼異步執行(Some code is running async)框架

  我遇到的另一種緣由是你在新線程中執行了某段邏輯。依賴的框架釋放了對象,並將該對象返回給主線程。 新的線程執行了已經釋放的對象,而後引起異常。要解決此問題.你必須單獨地開啓新線程來管理這個能夠被釋放的對象。dom

Task.Run( () => { // or ThreadPool.QueueUserWorkItem(async _ => {
    using (var context = **create your new context here, handle it directly or let the DI framework do its magic**){
        foreach(var user in Users){
            email.Send(user.email);
            context.....;
            context.SaveChanges();
        }
    }
});

  在APS.NET Core Web API 中,咱們能夠用Swashbuckle.AspNetCoreNSwag這兩個包來實現Swagger,並且兩者都是github上開源的。此外,nswag還提供了生成typescript客戶端代碼的方法以及用於API的服務代碼。異步

使用async void 而非 async Taskasync

  另外一種緣由多是你在本應該使用使用async Task的地方使用了async void。潛在的異步代碼會在你的線程返回以後執行。就像在代碼中啓動一個新線程同樣,它可能會意外地正確運行。在這種狀況下,您可能只在release版本中看到錯誤。當您不知道在哪裏查找時,這可能很難調試。PS:筆者剛好遭遇該狀況,我和個人小夥伴花費了一天時間來找這個bug。

   錯誤的寫法:

public async void FailtyMethod(){

   正確的寫法:

public async Task CorrectMethod(){

總結

  解決這些bug,有時候會使人沮喪,甚至抓狂。我曾今和個人另外兩個小夥伴花費了一天時間來找這個bug。最後你們都黔驢技窮。

  我但願這篇文章可以幫助到你。

參考

關注   請關注微信公衆號智客坊

使用場景

原文出處:https://www.cnblogs.com/lucky_hu/p/11667957.html

相關文章
相關標籤/搜索