1. ホーム
  2. asp.net-mvc

[解決済み] ASP MVC: IController Dispose()はいつ呼ばれるのか?

2023-07-09 05:09:19

質問

私は、大規模な MVC アプリケーションの 1 つを大規模なリファクタリング/速度調整中です。 それは数か月間本番環境に配備され、接続プールで接続を待つ間にタイムアウトが発生するようになりました。 私は、接続が適切に破棄されないという問題を突き止めました。

これを踏まえて、私はベースコントローラーに次の変更を加えました。

public class MyBaseController : Controller
{
    private ConfigurationManager configManager;  // Manages the data context.

    public MyBaseController()
    {
         configManager = new ConfigurationManager();
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (this.configManager != null)
            {
                this.configManager.Dispose();
                this.configManager = null;
            }
        }

        base.Dispose(disposing);
    }
}

では、2つの質問をさせていただきます。

  1. 私はレースコンディションを導入しているのでしょうか? というのも configManager を管理しているので DataContext を公開する IQueryable<> パラメータを ビューに公開する場合、私は Dispose() が呼び出されないようにする必要があります。 が呼び出されないようにする必要があります。
  2. MVCフレームワークは Dispose() を呼び出すのでしょうか? それとも、MVCフレームワークはそのことを GarbageCollectorに任せるのでしょうか?

どのように解決するのですか?

Disposeはビューがレンダリングされた後に呼び出されます。 常に .

の呼び出しでビューがレンダリングされます。 ActionResult.ExecuteResult . それが(間接的に)呼び出されるのは ControllerActionInvoker.InvokeAction によって呼び出され、それがまた ControllerBase.ExecuteCore .

ビューのレンダリング時にはコントローラはコールスタックにあるため、その時点で破棄することはできません。