Optimize Logic and code

This commit is contained in:
弘韬 张 2021-02-16 02:12:28 +08:00
parent b017bdeed4
commit 350499a480
3 changed files with 14 additions and 23 deletions

View file

@ -47,7 +47,7 @@ namespace Flow.Launcher.ViewModel
private readonly Internationalization _translator = InternationalizationManager.Instance; private readonly Internationalization _translator = InternationalizationManager.Instance;
private Channel<ResultsForUpdate> _resultsUpdateQueue; private ChannelWriter<ResultsForUpdate> _resultsUpdateChannelWriter;
private Task _resultsViewUpdateTask; private Task _resultsViewUpdateTask;
#endregion #endregion
@ -86,20 +86,21 @@ namespace Flow.Launcher.ViewModel
private void RegisterViewUpdate() private void RegisterViewUpdate()
{ {
_resultsUpdateQueue = Channel.CreateUnbounded<ResultsForUpdate>(); var resultUpdateChannel = Channel.CreateUnbounded<ResultsForUpdate>();
_resultsUpdateChannelWriter = resultUpdateChannel.Writer;
_resultsViewUpdateTask = _resultsViewUpdateTask =
Task.Run(updateAction).ContinueWith(continueAction, TaskContinuationOptions.OnlyOnFaulted); Task.Run(updateAction).ContinueWith(continueAction, TaskContinuationOptions.OnlyOnFaulted);
async Task updateAction() async Task updateAction()
{ {
var queue = new Dictionary<string, ResultsForUpdate>(); var queue = new Dictionary<string, ResultsForUpdate>();
var queueReader = _resultsUpdateQueue.Reader; var channelReader = resultUpdateChannel.Reader;
// it is not supposed to be false because it won't be complete // it is not supposed to be false because it won't be complete
while (await queueReader.WaitToReadAsync()) while (await channelReader.WaitToReadAsync())
{ {
await Task.Delay(20); await Task.Delay(20);
while (queueReader.TryRead(out var item)) while (channelReader.TryRead(out var item))
{ {
if (!item.Token.IsCancellationRequested) if (!item.Token.IsCancellationRequested)
queue[item.ID] = item; queue[item.ID] = item;
@ -134,7 +135,7 @@ namespace Flow.Launcher.ViewModel
if (e.Query.RawQuery == QueryText) // TODO: allow cancellation if (e.Query.RawQuery == QueryText) // TODO: allow cancellation
{ {
PluginManager.UpdatePluginMetadata(e.Results, pair.Metadata, e.Query); PluginManager.UpdatePluginMetadata(e.Results, pair.Metadata, e.Query);
if (!_resultsUpdateQueue.Writer.TryWrite(new ResultsForUpdate(e.Results, pair.Metadata, e.Query, _updateToken))) if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(e.Results, pair.Metadata, e.Query, _updateToken)))
{ {
Log.Error("MainViewModel", "Unable to add item to Result Update Queue"); Log.Error("MainViewModel", "Unable to add item to Result Update Queue");
}; };
@ -540,7 +541,7 @@ namespace Flow.Launcher.ViewModel
var results = await PluginManager.QueryForPlugin(plugin, query, currentCancellationToken); var results = await PluginManager.QueryForPlugin(plugin, query, currentCancellationToken);
if (currentCancellationToken.IsCancellationRequested || results == null) return; if (currentCancellationToken.IsCancellationRequested || results == null) return;
if (!_resultsUpdateQueue.Writer.TryWrite(new ResultsForUpdate(results, plugin.Metadata, query, currentCancellationToken))) if (!_resultsUpdateChannelWriter.TryWrite(new ResultsForUpdate(results, plugin.Metadata, query, currentCancellationToken)))
{ {
Log.Error("MainViewModel", "Unable to add item to Result Update Queue"); Log.Error("MainViewModel", "Unable to add item to Result Update Queue");
}; };

View file

@ -6,7 +6,7 @@ using System.Threading;
namespace Flow.Launcher.ViewModel namespace Flow.Launcher.ViewModel
{ {
public class ResultsForUpdate public struct ResultsForUpdate
{ {
public List<Result> Results { get; } public List<Result> Results { get; }
@ -16,13 +16,6 @@ namespace Flow.Launcher.ViewModel
public Query Query { get; } public Query Query { get; }
public CancellationToken Token { get; } public CancellationToken Token { get; }
public ResultsForUpdate(List<Result> results, string resultID, CancellationToken token)
{
Results = results;
ID = resultID;
Token = token;
}
public ResultsForUpdate(List<Result> results, PluginMetadata metadata, Query query, CancellationToken token) public ResultsForUpdate(List<Result> results, PluginMetadata metadata, Query query, CancellationToken token)
{ {
Results = results; Results = results;

View file

@ -183,13 +183,12 @@ namespace Flow.Launcher.ViewModel
private List<ResultViewModel> NewResults(List<Result> newRawResults, string resultId) private List<ResultViewModel> NewResults(List<Result> newRawResults, string resultId)
{ {
if (newRawResults.Count == 0) if (newRawResults.Count == 0)
return Results.ToList(); return Results;
var results = Results as IEnumerable<ResultViewModel>;
var newResults = newRawResults.Select(r => new ResultViewModel(r, _settings)); var newResults = newRawResults.Select(r => new ResultViewModel(r, _settings));
return results.Where(r => r.Result.PluginID != resultId) return Results.Where(r => r.Result.PluginID != resultId)
.Concat(newResults) .Concat(newResults)
.OrderByDescending(r => r.Result.Score) .OrderByDescending(r => r.Result.Score)
.ToList(); .ToList();
@ -198,11 +197,9 @@ namespace Flow.Launcher.ViewModel
private List<ResultViewModel> NewResults(IEnumerable<ResultsForUpdate> resultsForUpdates) private List<ResultViewModel> NewResults(IEnumerable<ResultsForUpdate> resultsForUpdates)
{ {
if (!resultsForUpdates.Any()) if (!resultsForUpdates.Any())
return Results.ToList(); return Results;
var results = Results as IEnumerable<ResultViewModel>; return Results.Where(r => r != null && !resultsForUpdates.Any(u => u.ID == r.Result.PluginID))
return results.Where(r => r != null && !resultsForUpdates.Any(u => u.Metadata.ID == r.Result.PluginID))
.Concat(resultsForUpdates.SelectMany(u => u.Results, (u, r) => new ResultViewModel(r, _settings))) .Concat(resultsForUpdates.SelectMany(u => u.Results, (u, r) => new ResultViewModel(r, _settings)))
.OrderByDescending(rv => rv.Result.Score) .OrderByDescending(rv => rv.Result.Score)
.ToList(); .ToList();