質問: 私はおそらく正しい方向に考えていないでしょう。私は、Dependency InjectionとASP.Net Coreについてはかなり新しいです。 私はASP.NetコアのWebサイトを持っており、その1つはExcelシートからユーザーがアップロードするデータベースにデータをインポートすることです。 Excelシートは膨大なものになる可能性があり、データ変換タスクは時間を要するため、バックグラウンドで実行したいと考えています。つまり、ユーザーがシートをアップロードすると、応答がすぐに送信され、バックグラウンドジョブ/スレッドがデータをインポートします。 バックグラウンドジョブを実行しようとしています: ``` Task.Run(() => ProcessImport(model)); ``` 私が実行する問題は、Processインポートメソッドが、Scopedとして追加されたASP.Net Dependency Injection Containerを介してAppDbContextにアクセスするリポジトリクラスを持つサービスを呼び出し、応答が返されるとコンテキストが破棄されることです。実行時例外が発生しましたが、その処理後にコンテキストを使用することはできません。 私の質問は、この状況を処理する最善の方法は何ですか?私はAppDbContextシングルトンを作るべきですか?私はProcessImportメソッドでAppDbContextの新しいインスタンスを作成し、それを渡す必要がありますか?私はDbContextはスレッドセーフではないので、それは良いアプローチですか?
回答: `IServiceScopeFactory`インスタンス(シングルトン)をタスクに渡す必要があります。 タスクの中で、データが到着したら、新しい`CreateScope()`を作成し、そのスコープからサービスを要求する必要があります。データ処理が終了したら、このスコープを`IServiceScopeFactory`します(ただし、次の実行には`IServiceScopeFactory`への参照を保持します)。 例えばこれを見てください。私はこのライブラリで小さくて速いタスクを実行します。 Gertが書いたように、重い/長時間の作業の場合、あなたの仕事は常に完了するまで頼りにしないでください。再始動の準備をして、同じデータを再処理する準備をしてください。