2013-10-04 56 views
2

我有一个winform应用程序,并在主窗体上放置了一个文本框。ontextchanged异步sql存储过程调用

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

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

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

回答

2

的事情是,如果我键入用户快速那么它应取消任何异步过程 它不应该需要取消任何东西 - 诀窍是直到你认为用户已经停止打字,开始什么。

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

令人惊叹的不错! @NDJ你有我可以看的示例代码吗?我会非常感激。谢谢 – VAAA

+0

更新了一些(非常简单)的代码 – NDJ

+0

我只是用别人放在这里,但后来删除的代码发布另一个问题:http://stackoverflow.com/questions/19192736/c-sharp-winform-async-process-cpu-增加到50 – VAAA