diff --git a/src/core/Akka/Dispatch/Dispatchers.cs b/src/core/Akka/Dispatch/Dispatchers.cs
index dfd0556d796..23a7ae5a158 100644
--- a/src/core/Akka/Dispatch/Dispatchers.cs
+++ b/src/core/Akka/Dispatch/Dispatchers.cs
@@ -185,10 +185,9 @@ public void ReadChannel()
///
internal sealed class TaskSchedulerExecutor : ExecutorService
{
- ///
- /// The scheduler
- ///
- private TaskScheduler _scheduler;
+ readonly TaskFactory _factory;
+
+ readonly CancellationTokenSource _cts = new CancellationTokenSource();
///
/// TBD
@@ -197,7 +196,7 @@ internal sealed class TaskSchedulerExecutor : ExecutorService
/// TBD
public TaskSchedulerExecutor(string id, TaskScheduler scheduler) : base(id)
{
- _scheduler = scheduler;
+ _factory = new TaskFactory(_cts.Token, TaskCreationOptions.HideScheduler, TaskContinuationOptions.None, scheduler);
}
// cache the delegate used for execution to prevent allocations
@@ -209,8 +208,7 @@ public TaskSchedulerExecutor(string id, TaskScheduler scheduler) : base(id)
/// TBD
public override void Execute(IRunnable run)
{
- var t = new Task(Executor, run);
- t.Start(_scheduler);
+ _factory.StartNew(Executor, run);
}
///
@@ -218,8 +216,8 @@ public override void Execute(IRunnable run)
///
public override void Shutdown()
{
- // clear the scheduler
- _scheduler = null;
+ // cancel queued tasks
+ _cts.Cancel();
}
}