mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
Use MemoryCache to control size
This commit is contained in:
parent
9b1180fc89
commit
8eecbfbed3
1 changed files with 33 additions and 22 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.Specialized;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
@ -10,6 +11,9 @@ using Flow.Launcher.Infrastructure.Logger;
|
||||||
using Flow.Launcher.Infrastructure.Storage;
|
using Flow.Launcher.Infrastructure.Storage;
|
||||||
using Flow.Launcher.Plugin.Program.Programs;
|
using Flow.Launcher.Plugin.Program.Programs;
|
||||||
using Flow.Launcher.Plugin.Program.Views;
|
using Flow.Launcher.Plugin.Program.Views;
|
||||||
|
using Microsoft.Extensions.Caching.Memory;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using Microsoft.Extensions.Primitives;
|
||||||
using Stopwatch = Flow.Launcher.Infrastructure.Stopwatch;
|
using Stopwatch = Flow.Launcher.Infrastructure.Stopwatch;
|
||||||
|
|
||||||
namespace Flow.Launcher.Plugin.Program
|
namespace Flow.Launcher.Plugin.Program
|
||||||
|
|
@ -27,10 +31,17 @@ namespace Flow.Launcher.Plugin.Program
|
||||||
private static BinaryStorage<Win32[]> _win32Storage;
|
private static BinaryStorage<Win32[]> _win32Storage;
|
||||||
private static BinaryStorage<UWP.Application[]> _uwpStorage;
|
private static BinaryStorage<UWP.Application[]> _uwpStorage;
|
||||||
|
|
||||||
private static readonly ConcurrentDictionary<string, List<Result>> cache = new();
|
|
||||||
|
|
||||||
private static readonly List<Result> emptyResults = new();
|
private static readonly List<Result> emptyResults = new();
|
||||||
|
|
||||||
|
private static readonly MemoryCacheOptions cacheOptions = new()
|
||||||
|
{
|
||||||
|
SizeLimit = 1560
|
||||||
|
};
|
||||||
|
private static MemoryCache cache = new(cacheOptions);
|
||||||
|
|
||||||
|
static Main()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
public void Save()
|
public void Save()
|
||||||
{
|
{
|
||||||
|
|
@ -40,31 +51,29 @@ namespace Flow.Launcher.Plugin.Program
|
||||||
|
|
||||||
public async Task<List<Result>> QueryAsync(Query query, CancellationToken token)
|
public async Task<List<Result>> QueryAsync(Query query, CancellationToken token)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (IsStartupIndexProgramsRequired)
|
if (IsStartupIndexProgramsRequired)
|
||||||
_ = IndexPrograms();
|
_ = IndexPrograms();
|
||||||
|
|
||||||
|
var result = await cache.GetOrCreateAsync(query.Search, async entry =>
|
||||||
|
{
|
||||||
|
var resultList = await Task.Run(() =>
|
||||||
|
_win32s.Cast<IProgram>()
|
||||||
|
.Concat(_uwps)
|
||||||
|
.AsParallel()
|
||||||
|
.WithCancellation(token)
|
||||||
|
.Where(p => p.Enabled)
|
||||||
|
.Select(p => p.Result(query.Search, _context.API))
|
||||||
|
.Where(r => r?.Score > 0)
|
||||||
|
.ToList());
|
||||||
|
|
||||||
if (!cache.TryGetValue(query.Search, out var result))
|
resultList = resultList.Any() ? resultList : emptyResults;
|
||||||
{
|
|
||||||
result = await Task.Run(delegate
|
|
||||||
{
|
|
||||||
return _win32s.Cast<IProgram>()
|
|
||||||
.Concat(_uwps)
|
|
||||||
.AsParallel()
|
|
||||||
.WithCancellation(token)
|
|
||||||
.Where(p => p.Enabled)
|
|
||||||
.Select(p => p.Result(query.Search, _context.API))
|
|
||||||
.Where(r => r?.Score > 0)
|
|
||||||
.ToList();
|
|
||||||
}, token).ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (result.Count == 0)
|
entry.SetSize(resultList.Count);
|
||||||
result = emptyResults;
|
entry.SetSlidingExpiration(TimeSpan.FromHours(8));
|
||||||
|
|
||||||
cache[query.Search] = result;
|
return resultList;
|
||||||
}
|
});
|
||||||
|
|
||||||
token.ThrowIfCancellationRequested();
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
@ -138,7 +147,9 @@ namespace Flow.Launcher.Plugin.Program
|
||||||
var t1 = Task.Run(IndexWin32Programs);
|
var t1 = Task.Run(IndexWin32Programs);
|
||||||
var t2 = Task.Run(IndexUwpPrograms);
|
var t2 = Task.Run(IndexUwpPrograms);
|
||||||
await Task.WhenAll(t1, t2).ConfigureAwait(false);
|
await Task.WhenAll(t1, t2).ConfigureAwait(false);
|
||||||
cache.Clear();
|
var oldCache = cache;
|
||||||
|
cache = new MemoryCache(cacheOptions);
|
||||||
|
oldCache.Dispose();
|
||||||
_settings.LastIndexTime = DateTime.Today;
|
_settings.LastIndexTime = DateTime.Today;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue