diff --git a/Wox/Helper/Forker.cs b/Wox/Helper/Forker.cs deleted file mode 100644 index 658e2e5b86..0000000000 --- a/Wox/Helper/Forker.cs +++ /dev/null @@ -1,145 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; - -namespace Wox.Helper -{ - /// - /// Provides a caller-friendly wrapper around parallel actions. - /// http://stackoverflow.com/a/540380 - /// - public sealed class Forker - { - int running; - private readonly object joinLock = new object(), eventLock = new object(); - - /// Raised when all operations have completed. - public event EventHandler AllComplete - { - add { lock (eventLock) { allComplete += value; } } - remove { lock (eventLock) { allComplete -= value; } } - } - private EventHandler allComplete; - /// Raised when each operation completes. - public event EventHandler ItemComplete - { - add { lock (eventLock) { itemComplete += value; } } - remove { lock (eventLock) { itemComplete -= value; } } - } - private EventHandler itemComplete; - - private void OnItemComplete(object state, Exception exception) - { - EventHandler itemHandler = itemComplete; // don't need to lock - if (itemHandler != null) itemHandler(this, new ParallelEventArgs(state, exception)); - if (Interlocked.Decrement(ref running) == 0) - { - EventHandler allHandler = allComplete; // don't need to lock - if (allHandler != null) allHandler(this, EventArgs.Empty); - lock (joinLock) - { - Monitor.PulseAll(joinLock); - } - } - } - - /// Adds a callback to invoke when each operation completes. - /// Current instance (for fluent API). - public Forker OnItemComplete(EventHandler handler) - { - if (handler == null) throw new ArgumentNullException("handler"); - ItemComplete += handler; - return this; - } - - /// Adds a callback to invoke when all operations are complete. - /// Current instance (for fluent API). - public Forker OnAllComplete(EventHandler handler) - { - if (handler == null) throw new ArgumentNullException("handler"); - AllComplete += handler; - return this; - } - - /// Waits for all operations to complete. - public void Join() - { - Join(-1); - } - - /// Waits (with timeout) for all operations to complete. - /// Whether all operations had completed before the timeout. - public bool Join(int millisecondsTimeout) - { - lock (joinLock) - { - if (CountRunning() == 0) return true; - Thread.SpinWait(1); // try our luck... - return (CountRunning() == 0) || - Monitor.Wait(joinLock, millisecondsTimeout); - } - } - - /// Indicates the number of incomplete operations. - /// The number of incomplete operations. - public int CountRunning() - { - return Interlocked.CompareExchange(ref running, 0, 0); - } - - /// Enqueues an operation. - /// The operation to perform. - /// The current instance (for fluent API). - public Forker Fork(ThreadStart action) { return Fork(action, null); } - - /// Enqueues an operation. - /// The operation to perform. - /// An opaque object, allowing the caller to identify operations. - /// The current instance (for fluent API). - public Forker Fork(ThreadStart action, object state) - { - if (action == null) throw new ArgumentNullException("action"); - Interlocked.Increment(ref running); - ThreadPool.QueueUserWorkItem(delegate - { - Exception exception = null; - try - { - action(); - } - catch (Exception ex) - { - exception = ex; -#if (DEBUG) - { - throw; - } -#endif - } - OnItemComplete(state, exception); - }); - return this; - } - - - /// Event arguments representing the completion of a parallel action. - public class ParallelEventArgs : EventArgs - { - private readonly object state; - private readonly Exception exception; - internal ParallelEventArgs(object state, Exception exception) - { - this.state = state; - this.exception = exception; - } - - /// The opaque state object that identifies the action (null otherwise). - public object State { get { return state; } } - - /// The exception thrown by the parallel action, or null if it completed without exception. - public Exception Exception { get { return exception; } } - } - } -} diff --git a/Wox/PluginLoader/Plugins.cs b/Wox/PluginLoader/Plugins.cs index ac373b8c93..fce1a82309 100644 --- a/Wox/PluginLoader/Plugins.cs +++ b/Wox/PluginLoader/Plugins.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using Wox.Helper; using Wox.Infrastructure.Storage.UserSettings; using Wox.Plugin; @@ -20,19 +21,16 @@ namespace Wox.PluginLoader plugins.AddRange(new CSharpPluginLoader().LoadPlugin(pluginMetadatas)); plugins.AddRange(new BasePluginLoader().LoadPlugin(pluginMetadatas)); - Forker forker = new Forker(); foreach (PluginPair pluginPair in plugins) { PluginPair pair = pluginPair; - forker.Fork(() => pair.Plugin.Init(new PluginInitContext() + ThreadPool.QueueUserWorkItem(o => pair.Plugin.Init(new PluginInitContext() { CurrentPluginMetadata = pair.Metadata, Proxy = HttpProxy.Instance, API = App.Window })); } - - forker.Join(); } public static List AllPlugins diff --git a/Wox/Wox.csproj b/Wox/Wox.csproj index 68211d8da7..fbf3ae6aee 100644 --- a/Wox/Wox.csproj +++ b/Wox/Wox.csproj @@ -129,7 +129,6 @@ WPFErrorReportingDialog.xaml -