あなたはそのエラーを得ています Taskクラスがタスクを開始する前にすでに開始しているします。あなたは今まで呼び出す必要がStartコンストラクターを呼び出して、あなたが作成することを課題にし、あなたがそれを作成するときにタスクを開始しないように説得力のある理由がない限り、あなたもそれを行うべきではありません。すぐに開始したい場合は、Task.RunまたはTask.Factory.StartNewを使用して、新しいを作成して開始する必要がありますTask。
そのため、今ではその厄介な問題を取り除くことがわかっていStartます。コードを実行すると、メッセージボックスがすぐに表示され、5秒後ではないことがわかります。
まあ、Task.Delay5秒で完了するタスクを提供します。スレッドの実行を5秒間停止しません。あなたがしたいことは、そのタスクが終了した後に実行されるいくつかのコードを持っていることです。それは何ですかContinueWithが目的です。これにより、特定のタスクが完了した後にコードを実行できます。
public void FunctionA()
{
Task.Delay(5000)
.ContinueWith(t =>
{
MessageBox.Show("Waiting Complete");
});
}
これは期待どおりに動作します。
C#5.0のawaitキーワードを活用して、継続をより簡単に追加することもできます。
public async Task FunctionA()
{
await Task.Delay(5000);
MessageBox.Show("Waiting Complete");
}
ここで行われていることの完全な説明はこの質問の範囲を超えていますが、最終結果は前のメソッドと非常によく似た動作をするメソッドです。メソッドを呼び出してから5秒後にメッセージボックスが表示されますが、どちらの場合もメソッド自体はすぐに[ほとんど]を返します。とawaitは言っても、非常に強力であり、シンプルで簡単に見えるメソッドを書くことができますが、ContinueWith直接使用して書くのははるかに困難で面倒です。また、多くのボイラープレートコードを取り除き、エラー処理を大幅に簡素化します。
Wait()タスクを呼び出すと、タスクが解決されるまで現在のスレッドがブロックされます。それがあなたが起こりたいことではほとんどありません。