问题
My MVC application is handling searches via a standard search box on a webpage. I'm trying to keep track of a user's searches - if they type a new search then I want to cancel their previous search and launch the new one.
I'm using a dictionary of sessionIDs and Searcher
objects (my object that has a method Search()
in it.
The issue I'm having is the flag to say SearchInProgress
is never appearing as false and so the function that cancels a search is never called. Possibly due to using a lock..? Here is the code in question:
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;
}
Also, the class contains the following static members:
private static object _lock = new object();
private static Dictionary<string, Searcher> _searches;
SearchInProgress
is a member variable of Searcher
and is set to false
on construction and then true
when the Search()
function is called... and then false
again just before Search()
returns the results.
来源:https://stackoverflow.com/questions/16315731/cancel-a-users-search-using-lock-and-session-id