// // TaskFactory.cs // // Author: // Jérémie "Garuma" Laval // // Copyright (c) 2009 Jérémie "Garuma" Laval // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #if NET_4_0 || BOOTSTRAP_NET_4_0 using System; using System.Threading; namespace System.Threading.Tasks { public class TaskFactory { TaskScheduler scheduler; TaskCreationOptions options; TaskContinuationOptions contOptions; CancellationToken token; #region ctors public TaskFactory () : this (CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Current) { } public TaskFactory (CancellationToken token) : this (token, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Current) { } public TaskFactory (TaskScheduler scheduler) : this (CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, scheduler) { } public TaskFactory (TaskCreationOptions options, TaskContinuationOptions contOptions) : this (CancellationToken.None, options, contOptions, TaskScheduler.Current) { } public TaskFactory (CancellationToken token, TaskCreationOptions options, TaskContinuationOptions contOptions, TaskScheduler scheduler) { this.token = token; this.scheduler = scheduler; this.options = options; this.contOptions = contOptions; } #endregion #region StartNew for Task public Task StartNew (Action action) { return StartNew (action, token, options, scheduler); } public Task StartNew (Action action, CancellationToken token) { return StartNew (action, token, options, scheduler); } public Task StartNew (Action action, TaskCreationOptions options) { return StartNew (action, token, options, scheduler); } public Task StartNew (Action action, object state) { return StartNew (action, state, token, options, scheduler); } public Task StartNew (Action action, object state, CancellationToken token) { return StartNew (action, state, token, options, scheduler); } public Task StartNew (Action action, object state, TaskCreationOptions options) { return StartNew (action, state, token, options, scheduler); } public Task StartNew (Action action, CancellationToken token, TaskCreationOptions options, TaskScheduler scheduler) { return StartNew ((o) => action (), null, token, options, scheduler); } public Task StartNew (Action action, object state, CancellationToken token, TaskCreationOptions options, TaskScheduler scheduler) { Task t = new Task (action, state, token, options); t.Start (scheduler); return t; } #endregion #region StartNew for Task public Task StartNew (Func function) { return StartNew (function, token, options, scheduler); } public Task StartNew (Func function, TaskCreationOptions options) { return StartNew (function, token, options, scheduler); } public Task StartNew (Func function, CancellationToken token) { return StartNew (function, token, options, scheduler); } public Task StartNew (Func function, CancellationToken token, TaskCreationOptions options, TaskScheduler scheduler) { return StartNew ((o) => function (), null, token, options, scheduler); } public Task StartNew (Func function, object state) { return StartNew (function, state, token, options, scheduler); } public Task StartNew (Func function, object state, CancellationToken token) { return StartNew (function, state, token, options, scheduler); } public Task StartNew (Func function, object state, TaskCreationOptions options) { return StartNew (function, state, token, options, scheduler); } public Task StartNew (Func function, object state, CancellationToken token, TaskCreationOptions options, TaskScheduler scheduler) { Task t = new Task (function, state, token, options); t.Start (scheduler); return t; } #endregion #region Continue public Task ContinueWhenAny (Task[] tasks, Action continuationAction) { return ContinueWhenAny (tasks, continuationAction, token, contOptions, scheduler); } public Task ContinueWhenAny (Task[] tasks, Action continuationAction, CancellationToken token) { return ContinueWhenAny (tasks, continuationAction, token, contOptions, scheduler); } public Task ContinueWhenAny (Task[] tasks, Action continuationAction, TaskContinuationOptions continuationOptions) { return ContinueWhenAny (tasks, continuationAction, token, continuationOptions, scheduler); } public Task ContinueWhenAny (Task[] tasks, Action continuationAction, CancellationToken token, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { AtomicBoolean trigger = new AtomicBoolean (); Task commonContinuation = new Task (null); foreach (Task t in tasks) { Task cont = new Task ((o) => { continuationAction ((Task)o); }, t, token, options); t.ContinueWithCore (cont, continuationOptions, scheduler, trigger.TrySet); cont.ContinueWithCore (commonContinuation, TaskContinuationOptions.None, scheduler); } return commonContinuation; } public Task ContinueWhenAny (Task[] tasks, Action> continuationAction) { return ContinueWhenAny (tasks, continuationAction, token, contOptions, scheduler); } public Task ContinueWhenAny (Task[] tasks, Action> continuationAction, CancellationToken token) { return ContinueWhenAny (tasks, continuationAction, token, contOptions, scheduler); } public Task ContinueWhenAny (Task[] tasks, Action> continuationAction, TaskContinuationOptions continuationOptions) { return ContinueWhenAny (tasks, continuationAction, token, continuationOptions, scheduler); } public Task ContinueWhenAny (Task[] tasks, Action> continuationAction, CancellationToken token, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { return ContinueWhenAny ((Task[]) tasks, (o) => continuationAction ((Task)o), token, continuationOptions, scheduler); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func continuationAction) { return ContinueWhenAny (tasks, continuationAction, token, contOptions, scheduler); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func continuationAction, CancellationToken token) { return ContinueWhenAny (tasks, continuationAction, token, contOptions, scheduler); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func continuationAction, TaskContinuationOptions continuationOptions) { return ContinueWhenAny (tasks, continuationAction, token, continuationOptions, scheduler); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func continuationAction, CancellationToken token, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { throw new NotImplementedException (); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func, TResult> continuationAction) { return ContinueWhenAny (tasks, continuationAction, token, contOptions, scheduler); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func, TResult> continuationAction, CancellationToken token) { return ContinueWhenAny (tasks, continuationAction, token, contOptions, scheduler); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func, TResult> continuationAction, TaskContinuationOptions continuationOptions) { return ContinueWhenAny (tasks, continuationAction, token, continuationOptions, scheduler); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func, TResult> continuationAction, CancellationToken token, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { return ContinueWhenAny ((Task[])tasks, (t) => continuationAction((Task)t), token, continuationOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Action continuationFunction) { return ContinueWhenAll (tasks, continuationFunction, token, contOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Action continuationFunction, CancellationToken token) { return ContinueWhenAll (tasks, continuationFunction, token, contOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Action continuationFunction, TaskContinuationOptions continuationOptions) { return ContinueWhenAll (tasks, continuationFunction, token, continuationOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Action continuationFunction, CancellationToken token, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { CountdownEvent evt = new CountdownEvent (tasks.Length); Task cont = new Task ((o) => continuationFunction ((Task[])o), tasks, token, options); foreach (Task t in tasks) t.ContinueWithCore (cont, continuationOptions, scheduler, evt.Signal); return cont; } public Task ContinueWhenAll (Task[] tasks, Action[]> continuationFunction) { return ContinueWhenAll (tasks, continuationFunction, token, contOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Action[]> continuationFunction, CancellationToken token) { return ContinueWhenAll (tasks, continuationFunction, token, contOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Action[]> continuationFunction, TaskContinuationOptions continuationOptions) { return ContinueWhenAll (tasks, continuationFunction, token, continuationOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Action[]> continuationFunction, CancellationToken token, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { return ContinueWhenAll ((Task[]) tasks, (o) => continuationFunction (tasks), token, continuationOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Func continuationFunction) { return ContinueWhenAll (tasks, continuationFunction, token, contOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Func continuationFunction, TaskContinuationOptions continuationOptions) { return ContinueWhenAll (tasks, continuationFunction, token, continuationOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Func continuationFunction, CancellationToken token) { return ContinueWhenAll (tasks, continuationFunction, token, contOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Func continuationFunction, CancellationToken token, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { CountdownEvent evt = new CountdownEvent (tasks.Length); Task cont = new Task ((o) => continuationFunction ((Task[])o), tasks, token, options); foreach (Task t in tasks) t.ContinueWithCore (cont, continuationOptions, scheduler, evt.Signal); return cont; } public Task ContinueWhenAll (Task[] tasks, Func[], TResult> continuationFunction) { return ContinueWhenAll (tasks, continuationFunction, token, contOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Func[], TResult> continuationFunction, TaskContinuationOptions continuationOptions) { return ContinueWhenAll (tasks, continuationFunction, token, continuationOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Func[], TResult> continuationFunction, CancellationToken token) { return ContinueWhenAll (tasks, continuationFunction, token, contOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Func[], TResult> continuationFunction, CancellationToken token, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { return ContinueWhenAll ((Task[]) tasks, (o) => continuationFunction (tasks), token, continuationOptions, scheduler); } #endregion #region FromAsync // For these methods to work we first have to convert the ThreadPool to use Tasks as it // is doing in 4.0, then all that is remaining is to identify the Task on which is // run the async operation (probably with some additional state in a IAsyncResult subclass) // and call its ContinueWith method accordingly const string errorMsg = "Mono's thread pool doesn't support this operation yet"; [MonoLimitation(errorMsg)] public Task FromAsync (IAsyncResult asyncResult, Action endMethod) { return FromAsync (asyncResult, endMethod, options); } [MonoLimitation(errorMsg)] public Task FromAsync (IAsyncResult asyncResult, Action endMethod, TaskCreationOptions creationOptions) { return FromAsync (asyncResult, endMethod, creationOptions); } [MonoLimitation(errorMsg)] public Task FromAsync (IAsyncResult asyncResult, Action endMethod, TaskCreationOptions creationOptions, TaskScheduler scheduler) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (IAsyncResult asyncResult, Func endMethod) { return FromAsync (asyncResult, endMethod, options); } [MonoLimitation(errorMsg)] public Task FromAsync (IAsyncResult asyncResult, Func endMethod, TaskCreationOptions creationOptions) { return FromAsync (asyncResult, endMethod, creationOptions); } [MonoLimitation(errorMsg)] public Task FromAsync (IAsyncResult asyncResult, Func endMethod, TaskCreationOptions creationOptions, TaskScheduler scheduler) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Action endMethod, object state) { return FromAsync ((a, c, o) => beginMethod (c, o), endMethod, state, options); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Action endMethod, object state, TaskCreationOptions creationOptions) { return FromAsync ((a, c, o) => beginMethod (c, o), endMethod, state, creationOptions); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Action endMethod, TArg1 arg1, object state) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Action endMethod, TArg1 arg1, object state, TaskCreationOptions creationOptions) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Action endMethod, TArg1 arg1, TArg2 arg2, object state) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Action endMethod, TArg1 arg1, TArg2 arg2, object state, TaskCreationOptions creationOptions) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Action endMethod, TArg1 arg1, TArg2 arg2, TArg3 arg3, object state) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Action endMethod, TArg1 arg1, TArg2 arg2, TArg3 arg3, object state, TaskCreationOptions creationOptions) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, object state) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, object state, TaskCreationOptions creationOptions) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, TArg1 arg1, object state) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, TArg1 arg1, object state, TaskCreationOptions creationOptions) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, TArg1 arg1, TArg2 arg2, object state) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, TArg1 arg1, TArg2 arg2, object state, TaskCreationOptions creationOptions) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, TArg1 arg1, TArg2 arg2, TArg3 arg3, object state) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, TArg1 arg1, TArg2 arg2, TArg3 arg3, object state, TaskCreationOptions creationOptions) { throw new NotSupportedException (errorMsg); } #endregion public TaskScheduler Scheduler { get { return scheduler; } } public TaskContinuationOptions ContinuationOptions { get { return contOptions; } } public TaskCreationOptions CreationOptions { get { return options; } } public CancellationToken CancellationToken { get { return token; } } } public class TaskFactory { TaskScheduler scheduler; TaskCreationOptions options; TaskContinuationOptions contOptions; CancellationToken token; TaskFactory parent; #region ctors public TaskFactory () : this (CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Current) { } public TaskFactory (TaskScheduler scheduler) : this (CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, scheduler) { } public TaskFactory (CancellationToken token) : this (token, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Current) { } public TaskFactory (TaskCreationOptions options, TaskContinuationOptions contOptions) : this (CancellationToken.None, options, contOptions, TaskScheduler.Current) { } public TaskFactory (CancellationToken token, TaskCreationOptions options, TaskContinuationOptions contOptions, TaskScheduler scheduler) { this.token = token; this.scheduler = scheduler; this.options = options; this.contOptions = contOptions; this.parent = new TaskFactory (token, options, contOptions, scheduler); } #endregion #region StartNew for Task public Task StartNew (Func function) { return StartNew (function, token, options, scheduler); } public Task StartNew (Func function, TaskCreationOptions options) { return StartNew (function, token, options, scheduler); } public Task StartNew (Func function, CancellationToken token) { return StartNew (function, token, options, scheduler); } public Task StartNew (Func function, CancellationToken token, TaskCreationOptions options, TaskScheduler scheduler) { return StartNew ((o) => function (), null, token, options, scheduler); } public Task StartNew (Func function, object state) { return StartNew (function, state, token, options, scheduler); } public Task StartNew (Func function, object state, TaskCreationOptions options) { return StartNew (function, state, token, options, scheduler); } public Task StartNew (Func function, object state, CancellationToken token) { return StartNew (function, state, token, options, scheduler); } public Task StartNew (Func function, object state, CancellationToken token, TaskCreationOptions options, TaskScheduler scheduler) { return parent.StartNew (function, state, token, options, scheduler); } #endregion #region Continue [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func continuationAction) { return ContinueWhenAny (tasks, continuationAction, token, contOptions, scheduler); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func continuationAction, CancellationToken token) { return ContinueWhenAny (tasks, continuationAction, token, contOptions, scheduler); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func continuationAction, TaskContinuationOptions continuationOptions) { return ContinueWhenAny (tasks, continuationAction, token, continuationOptions, scheduler); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func continuationAction, CancellationToken token, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { throw new NotImplementedException (); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func, TResult> continuationAction) { return ContinueWhenAny (tasks, continuationAction, token, contOptions, scheduler); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func, TResult> continuationAction, CancellationToken token) { return ContinueWhenAny (tasks, continuationAction, token, contOptions, scheduler); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func, TResult> continuationAction, TaskContinuationOptions continuationOptions) { return ContinueWhenAny (tasks, continuationAction, token, continuationOptions, scheduler); } [MonoTODO] public Task ContinueWhenAny (Task[] tasks, Func, TResult> continuationAction, CancellationToken token, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { throw new NotImplementedException (); } public Task ContinueWhenAll (Task[] tasks, Func continuationFunction) { return ContinueWhenAll (tasks, continuationFunction, token, contOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Func continuationFunction, TaskContinuationOptions continuationOptions) { return ContinueWhenAll (tasks, continuationFunction, token, continuationOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Func continuationFunction, CancellationToken token) { return ContinueWhenAll (tasks, continuationFunction, token, contOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Func continuationFunction, CancellationToken token, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { CountdownEvent evt = new CountdownEvent (tasks.Length); Task cont = new Task ((o) => continuationFunction (tasks), tasks, token, options); foreach (Task t in tasks) t.ContinueWithCore (cont, continuationOptions, scheduler, evt.Signal); return cont; } public Task ContinueWhenAll (Task[] tasks, Func[], TResult> continuationFunction) { return ContinueWhenAll (tasks, continuationFunction, token, contOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Func[], TResult> continuationFunction, TaskContinuationOptions continuationOptions) { return ContinueWhenAll (tasks, continuationFunction, token, continuationOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Func[], TResult> continuationFunction, CancellationToken token) { return ContinueWhenAll (tasks, continuationFunction, token, contOptions, scheduler); } public Task ContinueWhenAll (Task[] tasks, Func[], TResult> continuationFunction, CancellationToken token, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { CountdownEvent evt = new CountdownEvent (tasks.Length); Task cont = new Task ((o) => continuationFunction (tasks), tasks, token, options); foreach (Task t in tasks) t.ContinueWithCore (cont, continuationOptions, scheduler, evt.Signal); return cont; } #endregion #region FromAsync const string errorMsg = "Mono's thread pool doesn't support this operation yet"; [MonoLimitation(errorMsg)] public Task FromAsync (IAsyncResult asyncResult, Func endMethod) { return FromAsync (asyncResult, endMethod, options); } [MonoLimitation(errorMsg)] public Task FromAsync (IAsyncResult asyncResult, Func endMethod, TaskCreationOptions creationOptions) { return FromAsync (asyncResult, endMethod, creationOptions); } [MonoLimitation(errorMsg)] public Task FromAsync (IAsyncResult asyncResult, Func endMethod, TaskCreationOptions creationOptions, TaskScheduler scheduler) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, object state) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, object state, TaskCreationOptions creationOptions) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, TArg1 arg1, object state) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, TArg1 arg1, object state, TaskCreationOptions creationOptions) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, TArg1 arg1, TArg2 arg2, object state) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, TArg1 arg1, TArg2 arg2, object state, TaskCreationOptions creationOptions) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, TArg1 arg1, TArg2 arg2, TArg3 arg3, object state) { throw new NotSupportedException (errorMsg); } [MonoLimitation(errorMsg)] public Task FromAsync (Func beginMethod, Func endMethod, TArg1 arg1, TArg2 arg2, TArg3 arg3, object state, TaskCreationOptions creationOptions) { throw new NotSupportedException (errorMsg); } #endregion public TaskScheduler Scheduler { get { return scheduler; } } public TaskContinuationOptions ContinuationOptions { get { return contOptions; } } public TaskCreationOptions CreationOptions { get { return options; } } public CancellationToken CancellationToken { get { return token; } } } } #endif