たとえば、実行に約 5 分かかるストアド プロシージャを実行するプログラムがあるとします。
Database.RunJob(); -- takes 5 mins to complete
MessageBox.Show("Hi");
質問 - Database.RunJob() が完了する前に、メッセージ ボックスに「こんにちは」と表示されますか?
その場合、次のコード行に進む前にクエリが完了していることを確認するにはどうすればよいですか?
たとえば、実行に約 5 分かかるストアド プロシージャを実行するプログラムがあるとします。
Database.RunJob(); -- takes 5 mins to complete
MessageBox.Show("Hi");
質問 - Database.RunJob() が完了する前に、メッセージ ボックスに「こんにちは」と表示されますか?
その場合、次のコード行に進む前にクエリが完了していることを確認するにはどうすればよいですか?
有意義な回答を得るには情報が不十分です。
最善の答えは、Database.RunJob() が同期か非同期かによって異なります。
.RunJob が同期 (つまり、現在のスレッドで実行) の場合、MessageBox.Show は .RunJob が終了するまで実行されません。
非同期で、他のスレッドを生成して作業を行う場合、MessageBosh はジョブが終了する前にすぐに実行されます。
RunJob が実際に何をするかを示していないため、これ以上正確に答えることはできません。
.RunJob が非同期であるとしましょう。そのメソッドの設計者が彼の塩の価値があるなら、彼はそのメソッドから何かを返すでしょう。理想的にはTask<T>。
彼が Task を返した場合、C# 5 コードを次のように記述できます。
async void RunJobAndShowSuccessMessage()
{
await Database.RunJob();
MessageBox.Show("Hi, the job is done!");
}
.RunJob が synchronousであり、現在のスレッドでのみ実行されているとしましょう。これは、おそらく UI スレッドで実行したくないことを意味します。これを行うと、アプリケーションの UI が 5 分間フリーズします。
このシナリオを回避するために、別のスレッドでデータベース ジョブを実行して、アプリケーション UI の応答性を維持できるようにします。
async void RunJobAndShowSuccessMessage()
{
// Spawn a task to run in the background.
await Task.Factory.Start(() => Database.RunJob());
MessageBox.Show("Hi, the job is done!");
}