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
-