首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> C# >> 正文

在VisualStudio中使用Windows桌面搜索

  幸运的是,您不必考虑将其转换为托管调用。Windows Desktop Search SDK 可提供下载,并包括两个托管程序集,其中一个位于 WDSQuery.dll。该 COM 互操作程序集可包装相关的 Windows Desktop Search COM 类和接口。最重要的是,它提供了一个名为 SearchDesktopClass 的类,该类可实现 ISearchDesktop 并用于执行 WDS 查询。对于 SearchDesktopClass 类,建议的使用模式是为每个查询创建一个新的实例,从而检索结果并允许垃圾收集器随后进行清理,而不是只创建该类的一个实例并将其保留用于所有搜索。以下代码显示如何在加载项中使用 SearchDesktopClass:

以下是引用片段:
  SearchDesktopClass wdsSearch = new SearchDesktopClass();
  _Recordset result = wdsSearch.ExecuteQuery(
  "Secondary", "Rank, FileName, DisplayFolder, Url, PerceivedType",
  "Rank DESC, DocTitle", "Contains(PerceivedType,'document')");

  该查询指定了 4 个元素。它针对字符串“Secondary”而执行。逗号分隔列以 Rank 开始,以 PerceivedType 结束。排序的列为 Rank 和 DocTitle。最后,将筛选器设置为检索“document”类型的所有项。该调用实际上转换为对所有其中含有单词“Secondary”的文档的一个请求。

  Windows 桌面搜索支持许多内置的列,以进行查询和排序。图 5 中显示了您可以使用的一些常用列。注意,结果将在示例代码中有意按照 Rank 降序排序。这可确保最可能的结果位于结构集的顶部。

后台查询和 UI 更新

  早期的设计目标之一是构建一个几乎不影响 Visual Studio 响应性的工具。Windows 桌面搜索运行索引查询时,查询的执行速度会极快。然而根据搜索内容,执行一次查询仍会花费几毫秒到一秒,或更长的时间。若查询是在 Visual Studio 主线程上执行的,那么运行查询时,UI 会出现暂时的锁定。明显的解决方案就是在次级线程上执行查询。

  您可能会考虑使用新的 .NET Framework 2.0 BackgroundWorker 类。不幸的是,这行不通。因为该类与 SearchDesktopClass 及其 Windows Desktop Search COM 对象不兼容。尝试使用 BackgroundWorker 执行操作会产生 InvalidCastException 异常。要在次级线程上使用 SearchDesktopClass,您就必须使用单线程单元 (STA) 线程。BackgroundWorker 可以使用 .NET ThreadPool,默认情况下,其中会包含多线程单元 (MTA) 线程。

  因此,添加一个名为 WDSQueryWorker 的新类到加载项项目,可以将 Run 方法用作线程启动委托参数来创建一个 STA 线程。Run 方法使用 WaitHandle 类等待单独的事件句柄,如下所示:

以下是引用片段:
  private void Run() {
  try {
  while (true) {
  WaitHandle.WaitAny(_runHandles);
  if (_stopped) break;
  ProcessEvent();
  _runEvent.Reset();
  }
  }
  finally { _stopped = true; }
  }

  WDSQueryWorker 类还提供一个名为 DoWork 的公共方法,用来设置 Run 方法的等待事件,随后还会在 ProcessEvent 方法中触发查询执行。要查询的字段应在调用 DoWork 之前设置。

  WDSQueryWorker 类构造函数采用了三个参数:查询完成时调用的 UI 控件、查询完成委托和查询错误委托。两个委托都通过 Control.Invoke 调用。Invoke 方法可确保委托在控件的 UI 线程上执行。值得一提的是,传递到查询完成委托的参数都包含 _Resultset。另外,查询错误委托参数还包含 Exception 引用。

  虽然将查询执行移至单独线程,可以解决某些与运行大型查询相关的 Visual Studio 响应性问题,但仍存在一个有待解决的问题。像提到的那样,控件的 Invoke 方法在控件的 UI 线程上执行委托,并且该线程恰巧是 Visual Studio UI 线程。如果 Windows 桌面搜索返回一个大型结果集,则仍需花费时间填充加载项的结果列表视图。明显的解决方案是限制显示结果。事实上,如果您已启用“根据输入进行搜索”选项,Windows 桌面搜索将只显示每个类别的前六个结果,同时会添加一个“more…”项以显示其余结果。使用“选项”对话框,您可以设置加载项来限制显示结果,比方说,默认每个类别显示 100 项。如果您想看到整个结果集,可将“显示首批结果”的值设置为“0”以取消限制。

  您还希望确保当编辑器中存在用户类型代码时,即使具有受限的查询结果,也不会因查询执行而导致延迟。幸运的是,Visual Studio 可扩展性恰好为此提供了编辑器事件。可通过 Events 接口访问这些事件。图 6 显示了如何进行设置。

  基本思路是,如果用户正在输入代码、滚动代码或从一个窗口移至另一窗口,则延迟查询。您可以添加自己的委托,并将所有这些事件的全部委托设置为调用私有 EditorUpdateInProgress 方法,以延迟查询执行。

 

上一页  [1] [2] [3] [4] [5] 下一页

【责编:Peng】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·WEB程序开发--ASP.NET和PHP、JSP究竟学哪个?
 ·五步带你入门XML
 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 今日更新
 社区讨论
 博客论点
 频道精选
 Dotnet频道相关导航