Web search suggestion is loaded async

1. suggestion is async
2. if ping time of domain less than 300ms, then suggestion is still sync
3. #578 #539
This commit is contained in:
bao-qian
2016-05-05 16:08:44 +01:00
parent c41847c0d7
commit ba1e22955e
11 changed files with 293 additions and 217 deletions

View File

@@ -30,7 +30,7 @@ namespace Wox.Core.Plugin
public static IPublicAPI API { private set; get; }
private static PluginsSettings _settings;
private static List<PluginMetadata> _metadatas;
private static readonly string[] Directories = {Infrastructure.Wox.PreinstalledDirectory, Infrastructure.Wox.UserDirectory };
private static void ValidateUserDirectory()
@@ -41,11 +41,6 @@ namespace Wox.Core.Plugin
}
}
static PluginManager()
{
ValidateUserDirectory();
}
public static void Save()
{
foreach (var plugin in AllPlugins)
@@ -55,14 +50,19 @@ namespace Wox.Core.Plugin
}
}
static PluginManager()
{
ValidateUserDirectory();
// todo happlebao temp hack to let MainVM to register ResultsUpdated event
_metadatas = PluginConfig.Parse(Directories);
AllPlugins = PluginsLoader.CSharpPlugins(_metadatas).ToList();
}
public static void InitializePlugins(IPublicAPI api, PluginsSettings settings)
{
_settings = settings;
var metadatas = PluginConfig.Parse(Directories);
var plugins1 = PluginsLoader.CSharpPlugins(metadatas);
var plugins2 = PluginsLoader.PythonPlugins(metadatas, _settings.PythonDirectory);
AllPlugins = plugins1.Concat(plugins2).ToList();
var plugins = PluginsLoader.PythonPlugins(_metadatas, _settings.PythonDirectory);
AllPlugins = AllPlugins.Concat(plugins).ToList();
_settings.UpdatePluginSettings(AllPlugins);
//load plugin i18n languages
@@ -106,6 +106,7 @@ namespace Wox.Core.Plugin
}
}
});
}
public static void InstallPlugin(string path)
@@ -193,16 +194,12 @@ namespace Wox.Core.Plugin
var results = new List<Result>();
try
{
var milliseconds = Stopwatch.Normal($"Plugin.Query cost for {pair.Metadata.Name}", () =>
{
results = pair.Plugin.Query(query) ?? results;
results.ForEach(o =>
{
o.PluginDirectory = pair.Metadata.PluginDirectory;
o.PluginID = pair.Metadata.ID;
o.OriginQuery = query;
});
});
var metadata = pair.Metadata;
var milliseconds = Stopwatch.Normal($"Plugin.Query cost for {metadata.Name}", () =>
{
results = pair.Plugin.Query(query) ?? results;
UpdatePluginMetadata(results, metadata, query);
});
pair.QueryCount += 1;
pair.AvgQueryTime = pair.QueryCount == 1 ? milliseconds : (pair.AvgQueryTime + milliseconds) / 2;
}
@@ -213,6 +210,16 @@ namespace Wox.Core.Plugin
return results;
}
public static void UpdatePluginMetadata(List<Result> results, PluginMetadata metadata, Query query)
{
foreach (var r in results)
{
r.PluginDirectory = metadata.PluginDirectory;
r.PluginID = metadata.ID;
r.OriginQuery = query;
}
}
private static bool IsGlobalPlugin(PluginMetadata metadata)
{
return metadata.ActionKeywords.Contains(Query.GlobalPluginWildcardSign);