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(); } }