問題は、ユーザーがすばやく入力した場合、非同期プロセス
をキャンセルする必要があるということです。何もキャンセルする必要はありません。トリックは、ユーザーが入力を停止したと思うまで何も開始しないことです。
私は少し似たようなものを書きました。ユーザーがスレッドに新しいメソッドを開始させると入力すると、メソッドは (構成可能な) 時間待機してから実行されました。別のキーストロークでメソッドが再度呼び出され、待機期間がリセットされます。事実上、誰かが入力を続けた場合、タスクは実行されません。彼らが停止するとすぐに(たとえば、200ミリ秒の一時停止の後)。
私があなただったら、似たようなものを実装します。必要がないときにSQLに行くのを避けるからです
更新 - 簡単な例として、新しいフォームとデフォルトのテキスト ボックスを備えた新しいプロジェクトでは、次のコードが必要に応じて機能できるようにする必要があります (非常に単純な出発点として)。
public partial class Form1 : Form
{
private bool _waiting;
private bool _keyPressed;
private const int TypingDelay = 220; // ms used for delay between keystrokes to initiate search
public Form1()
{
InitializeComponent();
}
private void WaitWhileUserTyping()
{
var keepWaiting = true;
while (keepWaiting)
{
_keyPressed = false;
Thread.Sleep(TypingDelay);
keepWaiting = _keyPressed;
}
Invoke((MethodInvoker)(ExecuteSearch));
_waiting = false;
}
private void ExecuteSearch()
{
Thread.Sleep(200); // do lookup
// show search results...
MessageBox.Show("Search complete");
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (_waiting)
{
_keyPressed = true;
return;
}
_waiting = true;
// kick off a thread to do the search if nothing happens after x ms
ThreadPool.QueueUserWorkItem(_ => WaitWhileUserTyping());
}
}