部分搜索机制的性能,击键之间的时差

时间:2016-01-12 17:28:40

标签: c# asp.net active-directory

我有一个私有方法,当用户在活动目录中搜索组名时会触发该方法。当'TxtBoxGroupNameSearch'中的文本发生更改时,将启动搜索。

    private void SearchForAGroup(object sender, EventArgs e)
    {
       Cursor.Current = Cursors.WaitCursor;
       dataGridGroupNameList.Rows.Clear();

       try
          {
            string searchString = TxtBoxGroupNameSearch.Text;
            var partialGroupNameMatches = AllGroupsResults.Cast<SearchResult>()
                                          .Where(sr => sr.Properties["name"].Cast<String>()
                                          .Any(s => s.Contains(searchString)));

            object[] fields = new object[2];
            int i = 1;
            foreach (var item in partialGroupNameMatches)
               {
                  fields[0] = i;
                  i++;
                  fields[1] = item.Properties["name"][0].ToString();
                  dataGridGroupNameList.Rows.Add(fields);
               }    

            groupName = partialGroupNameMatches.ToList()[0]
                        .Properties["name"][0]
                        .ToString(); // gets the first GroupName on the grid

            GetUsers(groupName); // calls a get user method - LDAP query to get all users 
                                    specific to the 'groupName'

            BindToUserListGrid(AllGroupUsers); // Binds all users to a 2nd gridView  
         }
      catch { }
      Cursor.Current = Cursors.Default;
   }

一切都很棒。代码是有用的。然而,手头存在性能问题。每次文本框中的文本发生更改时,都会启动方法,找到所有部分匹配,绑定到主网格视图,然后使用ldap查询特定于新绑定gridView上第一个GroupName的所有用户。然后将用户列表绑定到辅助UserList GridView。

我已经添加了等待光标让用户知道,在等待时间内后台正在做的事情......但是我想知道是否可以改进过程以减少次要列表的次数查询用户,然后绑定到辅助gridView。

我的理论是: -

1)引入等待时间,以便仅在等待特定时间(例如1s)后查询用户的辅助列表....示例: - 用户键入'a',然后'b'然后在输入任何其他内容之前等待1秒...仅在此1s等待我们查询特定于第一个groupName匹配的用户列表,以'ab'开头...而不是当前的方式,我们将查询列表第一次按键'a'的用户,然后将它们绑定到辅助网格。然后再次查询用户列表第二次击键'a'+'b',然后绑定到辅助网格...从而将时间减少1/2。

计算两次不同击键之间的TimeSpan可能很棘手: -

 DateTime a = new DateTime();
 DateTime b = new DateTime();
 a = b; // previous stroke time
 b = DateTime.Now; // current stroke time
 if (b.Subtract(a).TotalSeconds > 2)
 {
     groupName = partialGroupNameMatches.ToList()[0].Properties["name"][0].ToString();
     GetUsers(groupName);
     BindToUserListGrid(AllGroupUsers);
  }

然而,上述方法存在一些问题......主要是键击,静音和第一次击键(永远)和最后击键(直到相当多的时间超过)之间的区别。我想改进这个过程。建议是最受欢迎的。

2)或穿线。

我想从该领域的一些更多专家那里获得一些可能的建议。

0 个答案:

没有答案