2017-07-11 7 views
0

私は単純なテキストボックスを持っており、私はValidatingハンドラ内でDelay Taskを待っています。 Validatedハンドラは、e.Cancel = trueを持っているかどうかにかかわらず、常に呼び出されます!待機中の呼び出しを省略すると、検証は期待どおりに行われることに注意してください。なぜこれが起こるのですか?検証イベントハンドラをasync/await(C#)で使用できないのはなぜですか?

private async void textBox1_Validating(object sender, CancelEventArgs e) 
{ 
    await Task.Delay(2000); 

    e.Cancel = true; 
} 

private void textBox1_Validated(object sender, EventArgs e) 
{ 
    MessageBox.Show("THIS WILL ALWAYS BE CALLED!"); 
} 
+0

本当に 'Validated'イベントを使用する必要がありますか? 'Validating'ですべてを実行してください。 – Sinatr

+0

@Sinatrこれは私が最後にしたことです...私はちょうどこれについての説明を知りたいと思っていました。 –

答えて

4

イベントは、すぐにイベントがイベントハンドラのすべての呼び出しが終了したとしてe.Cancelの値をチェックするために起こっているトリガーコード。あなたのコードはイベントハンドラから返されてから の値をかなり後でに変更するので、イベントハンドラを起動したコードはすでにe.Cancelのチェックを終えており、検証が成功したかどうかを判断していますあなたが価値を変えようとしているときに。

+0

'a.wait'の前に' e.Cancel'をtrueに設定した場合は、 'await'までコードが同期して実行されるので、呼び出し側が値をチェックしたときに設定されます。 – clcto

+0

@clcto、この発見を回答として投稿してみませんか? 'Validation'は呼び出されないので、実際に' await'の前に 'e.Cancel'を設定すると問題は解決します。 – Sinatr

+3

@Sinatrおそらく非同期操作(実際のコード内で)がアイテムが有効かどうかを判断しているので、問題を解決するつもりはありません。非同期操作*が、制御が有効かどうかを判断するのに使用されない場合、それは単にOPから完全に省略することができ、OP自体が問題を解決します。 – Servy

関連する問題