実行が完了するまでに約 2 ~ 3 分かかるストアド プロシージャが 1 つあります。ado.net から、ストアド プロシージャの実行がバックグラウンドで行われるようにしたいと考えています。ストアド プロシージャに要求を送信したらすぐにコードに戻る必要があります。誰でもこれについて私を助けることができますか?
4 に答える
Threadingを調査する必要があります。つまり、ストアド プロシージャを呼び出すスレッドを作成します。スレッドを開始すると、ビークグラウンドで実行されます。このスレッドには、スレッドの終了時に呼び出されるコールバック関数を含めることができます。
BackgroundWorkerは、スレッドを作成する簡単な方法です。
実際には2つのオプションがあります。他の人が述べているように、非常に合理的な解決策は、アプリケーション層でスレッド化を行うことです。1つのスレッドがストアドプロシージャを起動し、戻りを待ちます。
もう1つは、データベースで同様のことを行うことです。たとえば、SQL Serverは、非同期キューと呼ばれるものを提供します。コードをクエリに送信すると、キューリーダーによって取得され、バックグラウンドで実行されます。
あなたの場合、アプリケーションでのスレッド化はおそらく良い解決策です。1つのストアドプロシージャのワークロードが多くなる可能性があり、アプリケーションのすべてのスレッドを管理したくない場合に備えて、キューイングのアイデアに注目したいと思います。
ワーカー スレッドを使用して、バックグラウンド呼び出しで sproc 呼び出しを実行することを検討してください。sproc 呼び出しの結果を知りたいですか? その場合、待機して、sproc 呼び出しを実行しているワーカー スレッドに参加する必要があります。そうでない場合は、「起動して忘れる」ことができますが、この場合、エラー/例外について知らない場合があります。
これは、Joe Albahari one threading による優れた投稿です。
リアクティブ プログラミング (Rx) を使用してみることができます
Rx は、他のクールな機能の中で非同期呼び出しを簡素化するための新しいマイクロソフトの提案です
http://msdn.microsoft.com/en-us/data/gg577609.aspx
Nuget パッケージは次のとおりです。
https://nuget.org/packages/Rx-Main/1.0.11226
次のようになります。
// here call the sp
var o = Observable.Start(() => { Thread.Sleep(1000); });
o.Subscribe(x => { Console.WriteLine("Operation done"); });