c# - ontextchanged 异步 sql 存储过程调用

标签 c# sql-server winforms asynchronous async-await

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

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

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

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

最佳答案

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

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

关于c# - ontextchanged 异步 sql 存储过程调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19192257/

相关文章:

c# - 将任务作为要在异步方法 C# 中的循环内调用的参数传递

sql - MS SQL 如何用单个值更新多行?

c# - 如何拦截WebBrowser控件中的onbeforeunload事件?

c# - 现有图形转换为位图

c# - 以编程方式将 10 个用户登录到远程桌面 session

c# - 使用 DevExpress 或 Infragistics 将 HTML 或 PDF 转换为 RTF/DOC 或将 HTML/PDF 转换为图像

c# - 使用花括号的 block 。这是正确的 C# 语法吗?它有什么作用吗?

sql - 需要帮助编写 SQL 以在结帐时将促销应用到购物篮

sql - 使用递归公用表表达式从两个表中查找连续编号

c# - 以编程方式启动 Windows 10 表情符号热键