使用锁定和会话ID取消用户的搜索

时间:2013-05-01 09:29:28

标签: c# asp.net-mvc locking

我的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;

SearchInProgressSearcher的成员变量,在构造时设置为false,然后在调用true函数时设置为Search() ...然后在false返回结果之前再次Search()

0 个答案:

没有答案