1

処理に数分かかる重い MVC ルーチンを開発しています。次に、Ajax リクエストを呼び出します。プロセスが正しく開始され、スレッドを使用して実行し続ける場合は、コントローラーからインターフェイスに応答を送信したいと考えています。ただし、リターンが送信されると、データベースにアクセスする必要があり、次のエラーが発生します: オブジェクトが破棄されました。

私のコード:

var entidade = this._repositorioDeTabelaDePremiacaoUPL.ObterPorID(dto.ID);
if(entidade.StatusDoServico == ListaDeStatusDoServico.tcProcessando.Id)
     return Content("{success:false}");

Thread thread = new Thread(() => this._servicoDeTabelaDePremiacaoUPL.GerarTabela(dto));
thread.Start();
GerenciadorDeUnidadeDeTrabalho.Corrente.Commit();

return Content("{success:true}");
4

1 に答える 1

1

スレッドに余分な db コンテキストを使用し、最後に破棄することをお勧めします。Web アプリケーションの db コンテキストと追加スレッドのライフサイクルが異なるためです。Web アプリケーションの場合、一般的に HttpContext - Web リクエストごとであり、スレッドの場合はスレッドの寿命です。db コンテキストの新しいインスタンスを独自に作成するか、条件付きオブジェクトの構築を使用できます。

ノート:

アプリケーションのライフサイクル全体で db コンテキストを再利用し、それを静的プロパティとして参照することはあまり良い方法ではありません (同時実行の問題が発生し、コンテキスト内のエンティティの状態が一貫しなくなる可能性があります)。より良いアプローチは、db コンテキストを HTTPContext スコープ ( InstanceScope.HttpContext) に登録してから、コントローラーでコンストラクター インジェクションを使用することです。

Global.asax

ObjectFactory.Configure(i => { i.For<ContextoBase>().LifecycleIs(Lifecycles.GetLifecycle(InstanceScope.HttpContext)).Use<ContextoDaAplicacao>(); }

コントローラ

public MyController(ContextoBase context){
    this.context = context;
}
// then use it in action methods (note: it will be automatically disposed at the end of the web request)
于 2013-01-28T13:41:52.753 に答える