テキスト ボックスが textchange イベントを登録するたびに、非同期メソッドを呼び出します。この非同期メソッドは、テキスト ボックス内のテキストに対してタスクを実行します。問題は、ユーザーがすばやく入力しているときに、より新しい非同期メソッドが、その前に呼び出された非同期メソッドの前に終了する可能性があることです。
私がする必要があるのは、以前のすべての非同期メソッド呼び出しを破棄し、最新の呼び出しのみを続行することです。どうすればこれを達成できますか?
テキスト ボックスが textchange イベントを登録するたびに、非同期メソッドを呼び出します。この非同期メソッドは、テキスト ボックス内のテキストに対してタスクを実行します。問題は、ユーザーがすばやく入力しているときに、より新しい非同期メソッドが、その前に呼び出された非同期メソッドの前に終了する可能性があることです。
私がする必要があるのは、以前のすべての非同期メソッド呼び出しを破棄し、最新の呼び出しのみを続行することです。どうすればこれを達成できますか?
サードパーティのライブラリを使用したくない場合は、2 つの方法があります。
1 つ目は、アクションを実行する前に遅延を追加することです。したがって、非同期メソッドで、変更が発生したときに開始します。
await Task.Delay(1000); // Wait a second before getting into the work.
2 つ目は、変更時に作成したタスクへの参照を保持することです。その後、変更が再び発生した場合は、元のタスクが完了するのを待ってから新しいタスクを開始するか、必要に応じて作成時に CancellationToken を渡して、そのトークンをキャンセルして新しいタスクをすぐに開始できるようにすることができます。 .
最終的には、一方が他方を追い越さないことがいかに重要かということになります。重要な場合は、キャンセルした場合でも、元のタスクを待ちます。あまり問題にならない場合は、キャンセルして、自然に落ち着くまで待ちましょう。
もちろん、UI スレッドで何もする必要がない場合は、待機する場所に .ConfigureAwait(false) を追加することを忘れないでください。