我的 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()