public QueryQueue() { Current = null; Next = null; Lock = new object(); }
private QueryCacheEntry GetFromCache(QueryQueueEntry key) { lock (QueryCacheLock) { return(QueryCache.Get(key)); } }
public void ScheduleUpdateDataAsync(QueryQueueEntry key) { QueryQueueMutex.WaitOne(); QueryQueue.Enqueue(key); QueryQueueMutex.ReleaseMutex(); AnyOutstandingQuery.Signal(); }
private void QueryAsyncToCacheAndUpdate(QueryQueueEntry key) { var entry = GetFromCache(key); if (entry == null) { entry = QueryAsyncToCache(key); } onDataReceived?.Invoke(this, new KeyValuePair <QueryQueueEntry, QueryCacheEntry>(key, entry)); }
public void Enqueue(QueryQueueEntry key) { lock (Lock) { if (Current == null) { Current = key; } else { Next = key; } } }
public QueryQueueEntry Pop() { lock (Lock) { if (Current != null) { var ret = Current; Current = Next; Next = null; return(ret); } else { return(null); } } }
private QueryCacheEntry QueryAsyncToCache(QueryQueueEntry key) { if (!Database.IsOpen) { return(null); } try { var data = new QueryCacheEntry(null, null); var scores = key.QueryEval ? Task.Run(() => GetChessdbcnScores(key.CurrentFen)) : Task.FromResult(new Dictionary <Move, ChessDBCNScore>()); if (key.San == San.NullMove) { data.Stats = Database.Query(key.QueryFen); data.Scores = scores.Result; lock (QueryCacheLock) { QueryCache.Add(key, data); } } else { data.Stats = Database.Query(key.QueryFen, key.San); data.Scores = scores.Result; lock (QueryCacheLock) { QueryCache.Add(key, data); } } return(data); } catch { return(null); } }