ontextchanged async sql stored proc call

本文关键字:proc call stored sql async ontextchanged | 更新日期: 2023-09-27 18:34:10

我有一个wform应用程序,我在主窗体上放置了一个文本框。

我想要的是,在 OnTextChanged 事件上,我需要查询 sql(存储过程)表,以便提供键入字符的匹配项列表。例如,如果我输入字母A,那么我应该自动在数据库中搜索以字母"A"开头的名字,如果我然后输入字母"L",那么我应该去搜索以"AL"开头的名字等等。

问题是,如果我的用户快速键入,那么它应该取消正在进行的任何异步进程,并仅保留键入最后一个字母的任务。

关于如何实现这些目标的任何线索?

ontextchanged async sql stored proc call

问题是如果我用户快速键入,那么它应该取消任何异步进程 它不需要取消任何内容 - 诀窍是在您认为用户已停止键入之前不要启动任何内容。

写了一些类似的东西,当用户键入我让线程启动一个新方法时,该方法在执行之前等待(可配置)时间。 另一个击键将再次调用该方法并重置等待期 - 实际上,如果有人继续键入任务将不会执行;一旦他们停止它就会(例如在 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());
        }
    }