我的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
,然后在调用true
函数时设置为Search()
...然后在false
返回结果之前再次Search()
。