1

我的 MVC 应用程序通过网页上的标准搜索框处理搜索。我正在尝试跟踪用户的搜索 - 如果他们键入新搜索,那么我想取消他们之前的搜索并启动新搜索。

我正在使用 sessionID 和Searcher对象的字典(我的对象中有一个方法Search()

我遇到的问题是要说的标志SearchInProgress永远不会显示为假,因此永远不会调用取消搜索的函数。可能是由于使用了锁..?这是有问题的代码:

 public SearchResultModel Search(string sessionId, string query, long time) {

    SearchResultModel results;

    lock (_lock) {
      if (_searches.ContainsKey(sessionId)) { // Check if this user (by sessionId) has already searched at all
        if (_searches[sessionId].SearchInProgress) { // Is there a search already in progress, and if so cancel it!
          _searches[sessionId].Cancel();

          while (_searches[sessionId].WaitingForCancel()) {
            // Waiting for cancel to complete - I'll replace this with a Timer later
          }
        }
      }
      else { // If user hasn't searched before then they'll need a searcher instance
        Searcher searcher = new Searcher();
        _searches[sessionId] = searcher;
      }
    }

    results = _searches[sessionId].Search(Db, query);
    results.time = time;
    return results;
}

此外,该类包含以下静态成员:

private static object _lock = new object();
private static Dictionary<string, Searcher> _searches;

SearchInProgress是一个成员变量,Searcher并且在构造时设置为false,然后trueSearch()调用函数时设置为......然后在返回结果false之前再次设置。Search()

4

0 回答 0