0

別のスレッド内で EF がオブジェクトを更新しないという問題があります。オブジェクトを取得できますが、 を呼び出すとUnitOfWork.Commit();、SQL Server プロファイラーに更新中のアイテムが表示されません。これをスレッドの外で順番に実行すると、正常に動作します。何か案は?

 new Thread(() =>
                {
                    var divisionBracketsService = DependencyResolver.Current.GetService<IDivisionBracketsService>();

                    if (divisionBracketsService != null)
                        divisionBracketsService.ProcessGame(gameId);

                }).Start();

アップデート

スコープをスレッドに更新するとうまくいきました。両方のスコープを使用するパターンはありますか?

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InThreadScope();

アップデート

この質問Ninject InRequestScope fallback to InThreadScopeに気付きましたが、バージョン 3.0 の Ninject を使用しており、含まれていませんStandardScopeCallbacks.Request

4

1 に答える 1

2

あなたの質問から、ASP.NET でスレッドを開始して短くする問題を認識していないことがわかります。IIS は、アプリケーションを一貫性のない状態のままにして、いつでもそのスレッドを強制終了することができます。このスレッドの実行がアプリにとって不可欠な場合は、同期するか、Windows サービスなどの他のプロセスに委任するか、ASP.NET に登録して正しく実行する方法のノウハウを取得します。

ハイブリッド スコープの使用は決定論的ではありません。スレッドの実行時に http コンテキストが存在するかどうかはわかりませんが、いつでも破棄できるからです。より良い方法は、スレッドを新規作成する代わりに、名前付きスコープを使用して、一部のプロセッサ クラスを注入し、それをその dedents のスコープとして定義することです。

于 2012-08-17T23:48:10.043 に答える