私は、エンドユーザーがストアド プロシージャを実行するための単純なプログラムと思われるものを持っていますが、実行にはかなりの時間がかかる可能性があります。非同期接続を使用し、Begin/EndExecuteNonQuery を呼び出し、タイマーがまだ実行中であることをユーザーに知らせることができると考えました。ここまでは順調ですね。
特定のパラメーターが true の場合、呼び出されるストアド プロシージャは、最後に別のストアド プロシージャを実行します。この 2 番目の呼び出しが発生すると、IsCompleted はそうでなくても「true」になり、プログラムは 2 番目の SP が終了するまで EndExecuteNonQuery でブロックされるようです。確かなことはわかりませんが、これは、即時の SQL プロセスが完了するためだと思います (これ以上何もする必要がないため、EXEC 呼び出しは最後の行です) が、サブプロセスが呼び出しを続行します。
SP が完全に完了したかどうかを確認するにはどうすればよいですか? IAsyncResult.IsCompletedを完全には理解していないことに気づきました。私の印象はtrue
、通話が完全に終了したときになるということですが、そのリンクからの次のステートメントは、別のことを考えさせます。
このプロパティが true の場合、非同期操作で使用するために割り当てたリソースを破棄しても安全であると見なすことができます。
そのため、完全な SP が実際には完了していなくても、リソースを安全に破棄できるという点で、意図したとおりに機能している可能性があります。その場合、いつ完全に完了したかを知るための代替手段はありますか? ExecuteNonQuery
別のスレッド ( ?) で法線を使用することだけを検討しましたが、最初に/BackgroundWorker
で何かを見逃していないことを確認したいと思います。BeginXxx
EndXxx
また、SqlCommand を破棄して、プログラムが SP を待たずに終了できるようにする方法にもオープンです。エンド ユーザーにとって本当に重要なのは最初の SP だけだからです。
.Net 4、MSSQL 2008 R2 を使用。
関連コード:
conn = new SqlConnection(@"Server=SERVERSQL;Initial Catalog=MyDatabase;User ID=MyUser;Asynchronous Processing=true");
SqlCommand cmd = new SqlCommand("OuterProcedure", conn);
cmd.CommandType = CommandType.StoredProcedure;
//[...]
IAsyncResult asyncObj = cmd.BeginExecuteNonQuery();
int count = 0;
int finalLine = Console.CursorTop;
while (!asyncObj.IsCompleted) {
Console.SetCursorPosition(0, finalLine);
++count;
Console.WriteLine("Time taken (m:s): {0}:{1}", Math.Floor((double)count / 60), (count % 60).ToString("D2"));
System.Threading.Thread.Sleep(1000);
}
Console.WriteLine("Complete");
int results = cmd.EndExecuteNonQuery(asyncObj);