From 19346e58c6443638c245f85ee0b31a8c6e7af872 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Wed, 7 Sep 2016 06:49:53 +0100 Subject: [PATCH] Task Exceptions to ThrowHelper (#7076) --- .../src/System/Threading/Tasks/FutureFactory.cs | 80 ++++++------- src/mscorlib/src/System/Threading/Tasks/Task.cs | 130 ++++++++++----------- .../System/Threading/Tasks/TaskCompletionSource.cs | 18 +-- src/mscorlib/src/System/Threading/Tasks/future.cs | 34 +++--- src/mscorlib/src/System/ThrowHelper.cs | 54 ++++++++- 5 files changed, 184 insertions(+), 132 deletions(-) diff --git a/src/mscorlib/src/System/Threading/Tasks/FutureFactory.cs b/src/mscorlib/src/System/Threading/Tasks/FutureFactory.cs index 3f9937c..b1f634c 100644 --- a/src/mscorlib/src/System/Threading/Tasks/FutureFactory.cs +++ b/src/mscorlib/src/System/Threading/Tasks/FutureFactory.cs @@ -688,15 +688,15 @@ namespace System.Threading.Tasks ref StackCrawlMark stackMark) { if (asyncResult == null) - throw new ArgumentNullException("asyncResult"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.asyncResult); if (endFunction == null && endAction == null) - throw new ArgumentNullException("endMethod"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.endMethod); Contract.Requires((endFunction != null) != (endAction != null), "Both endFunction and endAction were non-null"); if (scheduler == null) - throw new ArgumentNullException("scheduler"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); Contract.EndContractBlock(); TaskFactory.CheckFromAsyncOptions(creationOptions, false); @@ -811,10 +811,10 @@ namespace System.Threading.Tasks object state, TaskCreationOptions creationOptions) { if (beginMethod == null) - throw new ArgumentNullException("beginMethod"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.beginMethod); if (endFunction == null && endAction == null) - throw new ArgumentNullException("endMethod"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.endMethod); Contract.Requires((endFunction != null) != (endAction != null), "Both endFunction and endAction were non-null"); @@ -948,10 +948,10 @@ namespace System.Threading.Tasks TArg1 arg1, object state, TaskCreationOptions creationOptions) { if (beginMethod == null) - throw new ArgumentNullException("beginMethod"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.beginMethod); if (endFunction == null && endAction == null) - throw new ArgumentNullException("endFunction"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.endFunction); Contract.Requires((endFunction != null) != (endAction != null), "Both endFunction and endAction were non-null"); @@ -1093,10 +1093,10 @@ namespace System.Threading.Tasks TArg1 arg1, TArg2 arg2, object state, TaskCreationOptions creationOptions) { if (beginMethod == null) - throw new ArgumentNullException("beginMethod"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.beginMethod); if (endFunction == null && endAction == null) - throw new ArgumentNullException("endMethod"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.endMethod); Contract.Requires((endFunction != null) != (endAction != null), "Both endFunction and endAction were non-null"); @@ -1245,10 +1245,10 @@ namespace System.Threading.Tasks TArg1 arg1, TArg2 arg2, TArg3 arg3, object state, TaskCreationOptions creationOptions) { if (beginMethod == null) - throw new ArgumentNullException("beginMethod"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.beginMethod); if (endFunction == null && endAction == null) - throw new ArgumentNullException("endMethod"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.endMethod); Contract.Requires((endFunction != null) != (endAction != null), "Both endFunction and endAction were non-null"); @@ -1387,18 +1387,18 @@ namespace System.Threading.Tasks internal static void CompleteFromAsyncResult(IAsyncResult asyncResult) { // Validate argument - if (asyncResult == null) throw new ArgumentNullException("asyncResult"); + if (asyncResult == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.asyncResult); Contract.EndContractBlock(); var promise = asyncResult.AsyncState as FromAsyncTrimPromise; - if (promise == null) throw new ArgumentException(Environment.GetResourceString("InvalidOperation_WrongAsyncResultOrEndCalledMultiple"), "asyncResult"); + if (promise == null) ThrowHelper.ThrowArgumentException(ExceptionResource.InvalidOperation_WrongAsyncResultOrEndCalledMultiple, ExceptionArgument.asyncResult); // Grab the relevant state and then null it out so that the task doesn't hold onto the state unnecessarily var thisRef = promise.m_thisRef; var endMethod = promise.m_endMethod; promise.m_thisRef = default(TInstance); promise.m_endMethod = null; - if (endMethod == null) throw new ArgumentException(Environment.GetResourceString("InvalidOperation_WrongAsyncResultOrEndCalledMultiple"), "asyncResult"); + if (endMethod == null) ThrowHelper.ThrowArgumentException(ExceptionResource.InvalidOperation_WrongAsyncResultOrEndCalledMultiple, ExceptionArgument.asyncResult); // Complete the promise. If the IAsyncResult completed synchronously, // we'll instead complete the promise at the call site. @@ -1491,7 +1491,7 @@ namespace System.Threading.Tasks [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var have to be marked non-inlineable public Task ContinueWhenAll(Task[] tasks, Func continuationFunction) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -1522,7 +1522,7 @@ namespace System.Threading.Tasks [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var have to be marked non-inlineable public Task ContinueWhenAll(Task[] tasks, Func continuationFunction, CancellationToken cancellationToken) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -1559,7 +1559,7 @@ namespace System.Threading.Tasks [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var have to be marked non-inlineable public Task ContinueWhenAll(Task[] tasks, Func continuationFunction, TaskContinuationOptions continuationOptions) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -1607,7 +1607,7 @@ namespace System.Threading.Tasks public Task ContinueWhenAll(Task[] tasks, Func continuationFunction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -1634,7 +1634,7 @@ namespace System.Threading.Tasks [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var have to be marked non-inlineable public Task ContinueWhenAll(Task[] tasks, Func[], TResult> continuationFunction) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -1667,7 +1667,7 @@ namespace System.Threading.Tasks public Task ContinueWhenAll(Task[] tasks, Func[], TResult> continuationFunction, CancellationToken cancellationToken) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -1706,7 +1706,7 @@ namespace System.Threading.Tasks public Task ContinueWhenAll(Task[] tasks, Func[], TResult> continuationFunction, TaskContinuationOptions continuationOptions) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -1755,7 +1755,7 @@ namespace System.Threading.Tasks public Task ContinueWhenAll(Task[] tasks, Func[], TResult> continuationFunction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -1771,10 +1771,10 @@ namespace System.Threading.Tasks { // check arguments TaskFactory.CheckMultiTaskContinuationOptions(continuationOptions); - if (tasks == null) throw new ArgumentNullException("tasks"); + if (tasks == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.tasks); //ArgumentNullException of continuationFunction or continuationAction is checked by the caller Contract.Requires((continuationFunction != null) != (continuationAction != null), "Expected exactly one of endFunction/endAction to be non-null"); - if (scheduler == null) throw new ArgumentNullException("scheduler"); + if (scheduler == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); Contract.EndContractBlock(); // Check tasks array and make defensive copy @@ -1818,10 +1818,10 @@ namespace System.Threading.Tasks { // check arguments TaskFactory.CheckMultiTaskContinuationOptions(continuationOptions); - if (tasks == null) throw new ArgumentNullException("tasks"); + if (tasks == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.tasks); //ArgumentNullException of continuationFunction or continuationAction is checked by the caller Contract.Requires((continuationFunction != null) != (continuationAction != null), "Expected exactly one of endFunction/endAction to be non-null"); - if (scheduler == null) throw new ArgumentNullException("scheduler"); + if (scheduler == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); Contract.EndContractBlock(); // Check tasks array and make defensive copy @@ -1891,7 +1891,7 @@ namespace System.Threading.Tasks [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var have to be marked non-inlineable public Task ContinueWhenAny(Task[] tasks, Func continuationFunction) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -1922,7 +1922,7 @@ namespace System.Threading.Tasks [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var have to be marked non-inlineable public Task ContinueWhenAny(Task[] tasks, Func continuationFunction, CancellationToken cancellationToken) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -1959,7 +1959,7 @@ namespace System.Threading.Tasks [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var have to be marked non-inlineable public Task ContinueWhenAny(Task[] tasks, Func continuationFunction, TaskContinuationOptions continuationOptions) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -2007,7 +2007,7 @@ namespace System.Threading.Tasks public Task ContinueWhenAny(Task[] tasks, Func continuationFunction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -2034,7 +2034,7 @@ namespace System.Threading.Tasks [MethodImplAttribute(MethodImplOptions.NoInlining)] // Methods containing StackCrawlMark local var have to be marked non-inlineable public Task ContinueWhenAny(Task[] tasks, Func, TResult> continuationFunction) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -2067,7 +2067,7 @@ namespace System.Threading.Tasks public Task ContinueWhenAny(Task[] tasks, Func, TResult> continuationFunction, CancellationToken cancellationToken) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -2106,7 +2106,7 @@ namespace System.Threading.Tasks public Task ContinueWhenAny(Task[] tasks, Func, TResult> continuationFunction, TaskContinuationOptions continuationOptions) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -2155,7 +2155,7 @@ namespace System.Threading.Tasks public Task ContinueWhenAny(Task[] tasks, Func, TResult> continuationFunction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler) { - if (continuationFunction == null) throw new ArgumentNullException("continuationFunction"); + if (continuationFunction == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); Contract.EndContractBlock(); StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller; @@ -2170,12 +2170,12 @@ namespace System.Threading.Tasks { // check arguments TaskFactory.CheckMultiTaskContinuationOptions(continuationOptions); - if (tasks == null) throw new ArgumentNullException("tasks"); - if(tasks.Length == 0) throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_EmptyTaskList"), "tasks"); + if (tasks == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.tasks); + if(tasks.Length == 0) ThrowHelper.ThrowArgumentException( ExceptionResource.Task_MultiTaskContinuation_EmptyTaskList, ExceptionArgument.tasks); //ArgumentNullException of continuationFunction or continuationAction is checked by the caller Contract.Requires((continuationFunction != null) != (continuationAction != null), "Expected exactly one of endFunction/endAction to be non-null"); - if (scheduler == null) throw new ArgumentNullException("scheduler"); + if (scheduler == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); Contract.EndContractBlock(); // Call common ContinueWhenAny() setup logic, extract starter @@ -2218,11 +2218,11 @@ namespace System.Threading.Tasks { // check arguments TaskFactory.CheckMultiTaskContinuationOptions(continuationOptions); - if (tasks == null) throw new ArgumentNullException("tasks"); - if (tasks.Length == 0) throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_EmptyTaskList"), "tasks"); + if (tasks == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.tasks); + if (tasks.Length == 0) ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_EmptyTaskList, ExceptionArgument.tasks); //ArgumentNullException of continuationFunction or continuationAction is checked by the caller Contract.Requires((continuationFunction != null) != (continuationAction != null), "Expected exactly one of endFunction/endAction to be non-null"); - if (scheduler == null) throw new ArgumentNullException("scheduler"); + if (scheduler == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); Contract.EndContractBlock(); // Call common ContinueWhenAny setup logic, extract starter diff --git a/src/mscorlib/src/System/Threading/Tasks/Task.cs b/src/mscorlib/src/System/Threading/Tasks/Task.cs index 777c7b9..36f8401 100644 --- a/src/mscorlib/src/System/Threading/Tasks/Task.cs +++ b/src/mscorlib/src/System/Threading/Tasks/Task.cs @@ -345,7 +345,7 @@ namespace System.Threading.Tasks // Also allow RunContinuationsAsynchronously because this is the constructor called by TCS if ((creationOptions & ~(TaskCreationOptions.AttachedToParent | TaskCreationOptions.RunContinuationsAsynchronously)) != 0) { - throw new ArgumentOutOfRangeException("creationOptions"); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.creationOptions); } // Only set a parent if AttachedToParent is specified. @@ -554,7 +554,7 @@ namespace System.Threading.Tasks { if (action == null) { - throw new ArgumentNullException("action"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.action); } Contract.EndContractBlock(); @@ -596,7 +596,7 @@ namespace System.Threading.Tasks TaskCreationOptions.PreferFairness | TaskCreationOptions.RunContinuationsAsynchronously)) != 0) { - throw new ArgumentOutOfRangeException("creationOptions"); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.creationOptions); } #if DEBUG @@ -616,7 +616,7 @@ namespace System.Threading.Tasks if (((creationOptions & TaskCreationOptions.LongRunning) != 0) && ((internalOptions & InternalTaskOptions.SelfReplicating) != 0)) { - throw new InvalidOperationException(Environment.GetResourceString("Task_ctor_LRandSR")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.Task_ctor_LRandSR); } // Assign options to m_stateAndOptionsFlag. @@ -1068,28 +1068,28 @@ namespace System.Threading.Tasks // set m_action to null. We would want to know if this is the reason that m_action == null. if (IsCompletedMethod(flags)) { - throw new InvalidOperationException(Environment.GetResourceString("Task_Start_TaskCompleted")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.Task_Start_TaskCompleted); } if (scheduler == null) { - throw new ArgumentNullException("scheduler"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); } var options = OptionsMethod(flags); if ((options & (TaskCreationOptions)InternalTaskOptions.PromiseTask) != 0) { - throw new InvalidOperationException(Environment.GetResourceString("Task_Start_Promise")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.Task_Start_Promise); } if ((options & (TaskCreationOptions)InternalTaskOptions.ContinuationTask) != 0) { - throw new InvalidOperationException(Environment.GetResourceString("Task_Start_ContinuationTask")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.Task_Start_ContinuationTask); } // Make sure that Task only gets started once. Or else throw an exception. if (Interlocked.CompareExchange(ref m_taskScheduler, scheduler, null) != null) { - throw new InvalidOperationException(Environment.GetResourceString("Task_Start_AlreadyStarted")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.Task_Start_AlreadyStarted); } ScheduleAndStart(true); @@ -1151,7 +1151,7 @@ namespace System.Threading.Tasks { if (scheduler == null) { - throw new ArgumentNullException("scheduler"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); } Contract.EndContractBlock(); @@ -1173,25 +1173,25 @@ namespace System.Threading.Tasks var options = OptionsMethod(flags); if ((options & (TaskCreationOptions)InternalTaskOptions.ContinuationTask) != 0) { - throw new InvalidOperationException(Environment.GetResourceString("Task_RunSynchronously_Continuation")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.Task_RunSynchronously_Continuation); } // Can't call this method on a promise-style task if ((options & (TaskCreationOptions)InternalTaskOptions.PromiseTask) != 0) { - throw new InvalidOperationException(Environment.GetResourceString("Task_RunSynchronously_Promise")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.Task_RunSynchronously_Promise); } // Can't call this method on a task that has already completed if (IsCompletedMethod(flags)) { - throw new InvalidOperationException(Environment.GetResourceString("Task_RunSynchronously_TaskCompleted")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.Task_RunSynchronously_TaskCompleted); } // Make sure that Task only gets started once. Or else throw an exception. if (Interlocked.CompareExchange(ref m_taskScheduler, scheduler, null) != null) { - throw new InvalidOperationException(Environment.GetResourceString("Task_RunSynchronously_AlreadyStarted")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.Task_RunSynchronously_AlreadyStarted); } // execute only if we successfully cancel when concurrent cancel attempts are made. @@ -1254,7 +1254,7 @@ namespace System.Threading.Tasks { Contract.Assert((m_stateFlags & TASK_STATE_CANCELED) != 0, "Task.RunSynchronously: expected TASK_STATE_CANCELED to be set"); // Can't call this method on canceled task. - throw new InvalidOperationException(Environment.GetResourceString("Task_RunSynchronously_TaskCompleted")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.Task_RunSynchronously_TaskCompleted); } } @@ -1272,7 +1272,7 @@ namespace System.Threading.Tasks // Validate arguments. if (scheduler == null) { - throw new ArgumentNullException("scheduler"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); } Contract.EndContractBlock(); @@ -1575,7 +1575,7 @@ namespace System.Threading.Tasks bool isDisposed = (m_stateFlags & TASK_STATE_DISPOSED) != 0; if (isDisposed) { - throw new ObjectDisposedException(null, Environment.GetResourceString("Task_ThrowIfDisposed")); + ThrowHelper.ThrowObjectDisposedException(ExceptionResource.Task_ThrowIfDisposed); } return CompletedEvent.WaitHandle; } @@ -1835,7 +1835,7 @@ namespace System.Threading.Tasks // Task must be completed to dispose if (!IsCompleted) { - throw new InvalidOperationException(Environment.GetResourceString("Task_Dispose_NotCompleted")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.Task_Dispose_NotCompleted); } // Dispose of the underlying completion event if it exists @@ -3047,7 +3047,7 @@ namespace System.Threading.Tasks long totalMilliseconds = (long)timeout.TotalMilliseconds; if (totalMilliseconds < -1 || totalMilliseconds > Int32.MaxValue) { - throw new ArgumentOutOfRangeException("timeout"); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.timeout); } return Wait((int)totalMilliseconds, default(CancellationToken)); @@ -3124,7 +3124,7 @@ namespace System.Threading.Tasks { if (millisecondsTimeout < -1) { - throw new ArgumentOutOfRangeException("millisecondsTimeout"); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.millisecondsTimeout); } Contract.EndContractBlock(); @@ -3879,13 +3879,13 @@ namespace System.Threading.Tasks // Throw on continuation with null action if (continuationAction == null) { - throw new ArgumentNullException("continuationAction"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationAction); } // Throw on continuation with null TaskScheduler if (scheduler == null) { - throw new ArgumentNullException("scheduler"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); } Contract.EndContractBlock(); @@ -4081,13 +4081,13 @@ namespace System.Threading.Tasks // Throw on continuation with null action if (continuationAction == null) { - throw new ArgumentNullException("continuationAction"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationAction); } // Throw on continuation with null TaskScheduler if (scheduler == null) { - throw new ArgumentNullException("scheduler"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); } Contract.EndContractBlock(); @@ -4296,13 +4296,13 @@ namespace System.Threading.Tasks // Throw on continuation with null function if (continuationFunction == null) { - throw new ArgumentNullException("continuationFunction"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); } // Throw on continuation with null task scheduler if (scheduler == null) { - throw new ArgumentNullException("scheduler"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); } Contract.EndContractBlock(); @@ -4515,13 +4515,13 @@ namespace System.Threading.Tasks // Throw on continuation with null function if (continuationFunction == null) { - throw new ArgumentNullException("continuationFunction"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); } // Throw on continuation with null task scheduler if (scheduler == null) { - throw new ArgumentNullException("scheduler"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); } Contract.EndContractBlock(); @@ -4573,7 +4573,7 @@ namespace System.Threading.Tasks TaskContinuationOptions illegalMask = TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.LongRunning; if ((continuationOptions & illegalMask) == illegalMask) { - throw new ArgumentOutOfRangeException("continuationOptions", Environment.GetResourceString("Task_ContinueWith_ESandLR")); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.continuationOptions, ExceptionResource.Task_ContinueWith_ESandLR); } // Check that no illegal options were specified @@ -4581,13 +4581,13 @@ namespace System.Threading.Tasks ~(creationOptionsMask | NotOnAnything | TaskContinuationOptions.LazyCancellation | TaskContinuationOptions.ExecuteSynchronously)) != 0) { - throw new ArgumentOutOfRangeException("continuationOptions"); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.continuationOptions); } // Check that we didn't specify "not on anything" if ((continuationOptions & NotOnAnything) == NotOnAnything) { - throw new ArgumentOutOfRangeException("continuationOptions", Environment.GetResourceString("Task_ContinueWith_NotOnAnything")); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.continuationOptions, ExceptionResource.Task_ContinueWith_NotOnAnything); } // This passes over all but LazyCancellation, which has no representation in TaskCreationOptions @@ -4912,7 +4912,7 @@ namespace System.Threading.Tasks long totalMilliseconds = (long)timeout.TotalMilliseconds; if (totalMilliseconds < -1 || totalMilliseconds > Int32.MaxValue) { - throw new ArgumentOutOfRangeException("timeout"); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.timeout); } return WaitAll(tasks, (int)totalMilliseconds); @@ -5022,11 +5022,11 @@ namespace System.Threading.Tasks { if (tasks == null) { - throw new ArgumentNullException("tasks"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.tasks); } if (millisecondsTimeout < -1) { - throw new ArgumentOutOfRangeException("millisecondsTimeout"); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.millisecondsTimeout); } Contract.EndContractBlock(); @@ -5054,7 +5054,7 @@ namespace System.Threading.Tasks if (task == null) { - throw new ArgumentException(Environment.GetResourceString("Task_WaitMulti_NullTask"), "tasks"); + ThrowHelper.ThrowArgumentException(ExceptionResource.Task_WaitMulti_NullTask, ExceptionArgument.tasks); } bool taskIsCompleted = task.IsCompleted; @@ -5135,7 +5135,7 @@ namespace System.Threading.Tasks // Now gather up and throw all of the exceptions. foreach (var task in tasks) AddExceptionsForCompletedTask(ref exceptions, task); Contract.Assert(exceptions != null, "Should have seen at least one exception"); - throw new AggregateException(exceptions); + ThrowHelper.ThrowAggregateException(exceptions); } return returnValue; @@ -5258,7 +5258,7 @@ namespace System.Threading.Tasks // If one or more threw exceptions, aggregate them. if (exceptions != null) { - throw new AggregateException(exceptions); + ThrowHelper.ThrowAggregateException(exceptions); } } @@ -5339,7 +5339,7 @@ namespace System.Threading.Tasks long totalMilliseconds = (long)timeout.TotalMilliseconds; if (totalMilliseconds < -1 || totalMilliseconds > Int32.MaxValue) { - throw new ArgumentOutOfRangeException("timeout"); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.timeout); } return WaitAny(tasks, (int)totalMilliseconds); @@ -5437,11 +5437,11 @@ namespace System.Threading.Tasks { if (tasks == null) { - throw new ArgumentNullException("tasks"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.tasks); } if (millisecondsTimeout < -1) { - throw new ArgumentOutOfRangeException("millisecondsTimeout"); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.millisecondsTimeout); } Contract.EndContractBlock(); @@ -5458,7 +5458,7 @@ namespace System.Threading.Tasks if (task == null) { - throw new ArgumentException(Environment.GetResourceString("Task_WaitMulti_NullTask"), "tasks"); + ThrowHelper.ThrowArgumentException(ExceptionResource.Task_WaitMulti_NullTask, ExceptionArgument.tasks); } if (signaledTaskIndex == -1 && task.IsCompleted) @@ -5516,7 +5516,7 @@ namespace System.Threading.Tasks /// The faulted task. public static Task FromException(Exception exception) { - if (exception == null) throw new ArgumentNullException("exception"); + if (exception == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.exception); Contract.EndContractBlock(); var task = new Task(); @@ -5531,7 +5531,7 @@ namespace System.Threading.Tasks public static Task FromCanceled(CancellationToken cancellationToken) { if (!cancellationToken.IsCancellationRequested) - throw new ArgumentOutOfRangeException("cancellationToken"); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.cancellationToken); Contract.EndContractBlock(); return new Task(true, TaskCreationOptions.None, cancellationToken); } @@ -5543,7 +5543,7 @@ namespace System.Threading.Tasks public static Task FromCanceled(CancellationToken cancellationToken) { if (!cancellationToken.IsCancellationRequested) - throw new ArgumentOutOfRangeException("cancellationToken"); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.cancellationToken); Contract.EndContractBlock(); return new Task(true, default(TResult), TaskCreationOptions.None, cancellationToken); } @@ -5554,7 +5554,7 @@ namespace System.Threading.Tasks /// The canceled task. internal static Task FromCancellation(OperationCanceledException exception) { - if (exception == null) throw new ArgumentNullException("exception"); + if (exception == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.exception); Contract.EndContractBlock(); var task = new Task(); @@ -5690,7 +5690,7 @@ namespace System.Threading.Tasks public static Task Run(Func function, CancellationToken cancellationToken) { // Check arguments - if (function == null) throw new ArgumentNullException("function"); + if (function == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.function); Contract.EndContractBlock(); if (AppContextSwitches.ThrowExceptionIfDisposedCancellationTokenSource) @@ -5741,7 +5741,7 @@ namespace System.Threading.Tasks public static Task Run(Func> function, CancellationToken cancellationToken) { // Check arguments - if (function == null) throw new ArgumentNullException("function"); + if (function == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.function); Contract.EndContractBlock(); if (AppContextSwitches.ThrowExceptionIfDisposedCancellationTokenSource) @@ -5806,7 +5806,7 @@ namespace System.Threading.Tasks long totalMilliseconds = (long)delay.TotalMilliseconds; if (totalMilliseconds < -1 || totalMilliseconds > Int32.MaxValue) { - throw new ArgumentOutOfRangeException("delay", Environment.GetResourceString("Task_Delay_InvalidDelay")); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.delay, ExceptionResource.Task_Delay_InvalidDelay); } return Delay((int)totalMilliseconds, cancellationToken); @@ -5850,7 +5850,7 @@ namespace System.Threading.Tasks // Throw on non-sensical time if (millisecondsDelay < -1) { - throw new ArgumentOutOfRangeException("millisecondsDelay", Environment.GetResourceString("Task_Delay_InvalidMillisecondsDelay")); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.millisecondsDelay, ExceptionResource.Task_Delay_InvalidMillisecondsDelay); } Contract.EndContractBlock(); @@ -5982,18 +5982,18 @@ namespace System.Threading.Tasks taskArray = new Task[taskCollection.Count]; foreach (var task in tasks) { - if (task == null) throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_NullTask"), "tasks"); + if (task == null) ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_NullTask, ExceptionArgument.tasks); taskArray[index++] = task; } return InternalWhenAll(taskArray); } // Do some argument checking and convert tasks to a List (and later an array). - if (tasks == null) throw new ArgumentNullException("tasks"); + if (tasks == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.tasks); List taskList = new List(); foreach (Task task in tasks) { - if (task == null) throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_NullTask"), "tasks"); + if (task == null) ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_NullTask, ExceptionArgument.tasks); taskList.Add(task); } @@ -6031,7 +6031,7 @@ namespace System.Threading.Tasks public static Task WhenAll(params Task[] tasks) { // Do some argument checking and make a defensive copy of the tasks array - if (tasks == null) throw new ArgumentNullException("tasks"); + if (tasks == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.tasks); Contract.EndContractBlock(); int taskCount = tasks.Length; @@ -6041,7 +6041,7 @@ namespace System.Threading.Tasks for (int i = 0; i < taskCount; i++) { Task task = tasks[i]; - if (task == null) throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_NullTask"), "tasks"); + if (task == null) ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_NullTask, ExceptionArgument.tasks); tasksCopy[i] = task; } @@ -6233,18 +6233,18 @@ namespace System.Threading.Tasks taskArray = new Task[taskCollection.Count]; foreach (var task in tasks) { - if (task == null) throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_NullTask"), "tasks"); + if (task == null) ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_NullTask, ExceptionArgument.tasks); taskArray[index++] = task; } return InternalWhenAll(taskArray); } // Do some argument checking and convert tasks into a List (later an array) - if (tasks == null) throw new ArgumentNullException("tasks"); + if (tasks == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.tasks); List> taskList = new List>(); foreach (Task task in tasks) { - if (task == null) throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_NullTask"), "tasks"); + if (task == null) ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_NullTask, ExceptionArgument.tasks); taskList.Add(task); } @@ -6285,7 +6285,7 @@ namespace System.Threading.Tasks public static Task WhenAll(params Task[] tasks) { // Do some argument checking and make a defensive copy of the tasks array - if (tasks == null) throw new ArgumentNullException("tasks"); + if (tasks == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.tasks); Contract.EndContractBlock(); int taskCount = tasks.Length; @@ -6295,7 +6295,7 @@ namespace System.Threading.Tasks for (int i = 0; i < taskCount; i++) { Task task = tasks[i]; - if (task == null) throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_NullTask"), "tasks"); + if (task == null) ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_NullTask, ExceptionArgument.tasks); tasksCopy[i] = task; } @@ -6457,10 +6457,10 @@ namespace System.Threading.Tasks /// public static Task WhenAny(params Task[] tasks) { - if (tasks == null) throw new ArgumentNullException("tasks"); + if (tasks == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.tasks); if (tasks.Length == 0) { - throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_EmptyTaskList"), "tasks"); + ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_EmptyTaskList, ExceptionArgument.tasks); } Contract.EndContractBlock(); @@ -6471,7 +6471,7 @@ namespace System.Threading.Tasks for (int i = 0; i < taskCount; i++) { Task task = tasks[i]; - if (task == null) throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_NullTask"), "tasks"); + if (task == null) ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_NullTask, ExceptionArgument.tasks); tasksCopy[i] = task; } @@ -6496,7 +6496,7 @@ namespace System.Threading.Tasks /// public static Task WhenAny(IEnumerable tasks) { - if (tasks == null) throw new ArgumentNullException("tasks"); + if (tasks == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.tasks); Contract.EndContractBlock(); // Make a defensive copy, as the user may manipulate the tasks collection @@ -6504,13 +6504,13 @@ namespace System.Threading.Tasks List taskList = new List(); foreach (Task task in tasks) { - if (task == null) throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_NullTask"), "tasks"); + if (task == null) ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_NullTask, ExceptionArgument.tasks); taskList.Add(task); } if (taskList.Count == 0) { - throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_EmptyTaskList"), "tasks"); + ThrowHelper.ThrowArgumentException(ExceptionResource.Task_MultiTaskContinuation_EmptyTaskList, ExceptionArgument.tasks); } // Previously implemented CommonCWAnyLogic() can handle the rest diff --git a/src/mscorlib/src/System/Threading/Tasks/TaskCompletionSource.cs b/src/mscorlib/src/System/Threading/Tasks/TaskCompletionSource.cs index 6ff70eb..8b1dd2a 100644 --- a/src/mscorlib/src/System/Threading/Tasks/TaskCompletionSource.cs +++ b/src/mscorlib/src/System/Threading/Tasks/TaskCompletionSource.cs @@ -156,7 +156,7 @@ namespace System.Threading.Tasks /// The was disposed. public bool TrySetException(Exception exception) { - if (exception == null) throw new ArgumentNullException("exception"); + if (exception == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.exception); bool rval = m_task.TrySetException(exception); if (!rval && !m_task.IsCompleted) SpinUntilCompleted(); @@ -185,18 +185,18 @@ namespace System.Threading.Tasks /// The was disposed. public bool TrySetException(IEnumerable exceptions) { - if (exceptions == null) throw new ArgumentNullException("exceptions"); + if (exceptions == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.exceptions); List defensiveCopy = new List(); foreach (Exception e in exceptions) { if (e == null) - throw new ArgumentException(Environment.GetResourceString("TaskCompletionSourceT_TrySetException_NullException"), "exceptions"); + ThrowHelper.ThrowArgumentException(ExceptionResource.TaskCompletionSourceT_TrySetException_NullException, ExceptionArgument.exceptions); defensiveCopy.Add(e); } if (defensiveCopy.Count == 0) - throw new ArgumentException(Environment.GetResourceString("TaskCompletionSourceT_TrySetException_NoExceptions"), "exceptions"); + ThrowHelper.ThrowArgumentException(ExceptionResource.TaskCompletionSourceT_TrySetException_NoExceptions, ExceptionArgument.exceptions); bool rval = m_task.TrySetException(defensiveCopy); if (!rval && !m_task.IsCompleted) SpinUntilCompleted(); @@ -238,11 +238,11 @@ namespace System.Threading.Tasks /// The was disposed. public void SetException(Exception exception) { - if (exception == null) throw new ArgumentNullException("exception"); + if (exception == null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.exception); if (!TrySetException(exception)) { - throw new InvalidOperationException(Environment.GetResourceString("TaskT_TransitionToFinal_AlreadyCompleted")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.TaskT_TransitionToFinal_AlreadyCompleted); } } @@ -268,7 +268,7 @@ namespace System.Threading.Tasks { if (!TrySetException(exceptions)) { - throw new InvalidOperationException(Environment.GetResourceString("TaskT_TransitionToFinal_AlreadyCompleted")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.TaskT_TransitionToFinal_AlreadyCompleted); } } @@ -316,7 +316,7 @@ namespace System.Threading.Tasks public void SetResult(TResult result) { if (!TrySetResult(result)) - throw new InvalidOperationException(Environment.GetResourceString("TaskT_TransitionToFinal_AlreadyCompleted")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.TaskT_TransitionToFinal_AlreadyCompleted); } /// @@ -364,7 +364,7 @@ namespace System.Threading.Tasks public void SetCanceled() { if(!TrySetCanceled()) - throw new InvalidOperationException(Environment.GetResourceString("TaskT_TransitionToFinal_AlreadyCompleted")); + ThrowHelper.ThrowInvalidOperationException(ExceptionResource.TaskT_TransitionToFinal_AlreadyCompleted); } } } diff --git a/src/mscorlib/src/System/Threading/Tasks/future.cs b/src/mscorlib/src/System/Threading/Tasks/future.cs index 9ce7ab6..39e6ca1 100644 --- a/src/mscorlib/src/System/Threading/Tasks/future.cs +++ b/src/mscorlib/src/System/Threading/Tasks/future.cs @@ -350,7 +350,7 @@ namespace System.Threading.Tasks { if ((internalOptions & InternalTaskOptions.SelfReplicating) != 0) { - throw new ArgumentOutOfRangeException("creationOptions", Environment.GetResourceString("TaskT_ctor_SelfReplicating")); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.creationOptions, ExceptionResource.TaskT_ctor_SelfReplicating); } } @@ -380,7 +380,7 @@ namespace System.Threading.Tasks { if ((internalOptions & InternalTaskOptions.SelfReplicating) != 0) { - throw new ArgumentOutOfRangeException("creationOptions", Environment.GetResourceString("TaskT_ctor_SelfReplicating")); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.creationOptions, ExceptionResource.TaskT_ctor_SelfReplicating); } } @@ -391,15 +391,15 @@ namespace System.Threading.Tasks { if (function == null) { - throw new ArgumentNullException("function"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.function); } if (scheduler == null) { - throw new ArgumentNullException("scheduler"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); } if ((internalOptions & InternalTaskOptions.SelfReplicating) != 0) { - throw new ArgumentOutOfRangeException("creationOptions", Environment.GetResourceString("TaskT_ctor_SelfReplicating")); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.creationOptions, ExceptionResource.TaskT_ctor_SelfReplicating); } // Create and schedule the future. @@ -415,15 +415,15 @@ namespace System.Threading.Tasks { if (function == null) { - throw new ArgumentNullException("function"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.function); } if (scheduler == null) { - throw new ArgumentNullException("scheduler"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); } if ((internalOptions & InternalTaskOptions.SelfReplicating) != 0) { - throw new ArgumentOutOfRangeException("creationOptions", Environment.GetResourceString("TaskT_ctor_SelfReplicating")); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.creationOptions, ExceptionResource.TaskT_ctor_SelfReplicating); } // Create and schedule the future. @@ -879,12 +879,12 @@ namespace System.Threading.Tasks { if (continuationAction == null) { - throw new ArgumentNullException("continuationAction"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationAction); } if (scheduler == null) { - throw new ArgumentNullException("scheduler"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); } TaskCreationOptions creationOptions; @@ -1083,12 +1083,12 @@ namespace System.Threading.Tasks { if (continuationAction == null) { - throw new ArgumentNullException("continuationAction"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationAction); } if (scheduler == null) { - throw new ArgumentNullException("scheduler"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); } TaskCreationOptions creationOptions; @@ -1310,12 +1310,12 @@ namespace System.Threading.Tasks { if (continuationFunction == null) { - throw new ArgumentNullException("continuationFunction"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); } if (scheduler == null) { - throw new ArgumentNullException("scheduler"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); } TaskCreationOptions creationOptions; @@ -1544,12 +1544,12 @@ namespace System.Threading.Tasks { if (continuationFunction == null) { - throw new ArgumentNullException("continuationFunction"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.continuationFunction); } if (scheduler == null) { - throw new ArgumentNullException("scheduler"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.scheduler); } TaskCreationOptions creationOptions; @@ -1594,7 +1594,7 @@ namespace System.Threading.Tasks IDisposable IObservable.Subscribe(IObserver observer) { if (observer == null) - throw new System.ArgumentNullException("observer"); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.observer); var continuationTask = diff --git a/src/mscorlib/src/System/ThrowHelper.cs b/src/mscorlib/src/System/ThrowHelper.cs index db1419d..3105d56 100644 --- a/src/mscorlib/src/System/ThrowHelper.cs +++ b/src/mscorlib/src/System/ThrowHelper.cs @@ -36,7 +36,8 @@ namespace System { // multiple times for different instantiation. // - using System.Runtime.CompilerServices; + using Collections.Generic; + using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Diagnostics.Contracts; @@ -129,11 +130,21 @@ namespace System { throw new ObjectDisposedException(objectName, Environment.GetResourceString(GetResourceName(resource))); } + internal static void ThrowObjectDisposedException(ExceptionResource resource) + { + throw new ObjectDisposedException(null, Environment.GetResourceString(GetResourceName(resource))); + } + internal static void ThrowNotSupportedException() { throw new NotSupportedException(); } + internal static void ThrowAggregateException(List exceptions) + { + throw new AggregateException(exceptions); + } + // Allow nulls for reference types and Nullable, but not for value types. // Aggressively inline so the jit evaluates the if in place and either drops the call altogether // Or just leaves null test and call to the Non-returning ThrowHelper.ThrowArgumentNullException @@ -218,6 +229,24 @@ namespace System { comparer, endIndex, keys, + creationOptions, + timeout, + tasks, + scheduler, + continuationFunction, + millisecondsTimeout, + millisecondsDelay, + function, + exceptions, + exception, + cancellationToken, + delay, + asyncResult, + endMethod, + endFunction, + beginMethod, + continuationOptions, + continuationAction, } @@ -289,6 +318,29 @@ namespace System { ArgumentOutOfRange_EndIndexStartIndex, Arg_LowerBoundsMustMatch, Arg_BogusIComparer, + Task_WaitMulti_NullTask, + Task_ThrowIfDisposed, + Task_Start_TaskCompleted, + Task_Start_Promise, + Task_Start_ContinuationTask, + Task_Start_AlreadyStarted, + Task_RunSynchronously_TaskCompleted, + Task_RunSynchronously_Continuation, + Task_RunSynchronously_Promise, + Task_RunSynchronously_AlreadyStarted, + Task_MultiTaskContinuation_NullTask, + Task_MultiTaskContinuation_EmptyTaskList, + Task_Dispose_NotCompleted, + Task_Delay_InvalidMillisecondsDelay, + Task_Delay_InvalidDelay, + Task_ctor_LRandSR, + Task_ContinueWith_NotOnAnything, + Task_ContinueWith_ESandLR, + TaskT_TransitionToFinal_AlreadyCompleted, + TaskT_ctor_SelfReplicating, + TaskCompletionSourceT_TrySetException_NullException, + TaskCompletionSourceT_TrySetException_NoExceptions, + InvalidOperation_WrongAsyncResultOrEndCalledMultiple, } } -- 2.7.4