diff options
Diffstat (limited to 'src/mscorlib/shared/System/Threading/Tasks')
3 files changed, 214 insertions, 0 deletions
diff --git a/src/mscorlib/shared/System/Threading/Tasks/TaskCanceledException.cs b/src/mscorlib/shared/System/Threading/Tasks/TaskCanceledException.cs new file mode 100644 index 0000000000..d7690d4c7c --- /dev/null +++ b/src/mscorlib/shared/System/Threading/Tasks/TaskCanceledException.cs @@ -0,0 +1,89 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +// =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ +// +// +// +// An exception for task cancellations. +// +// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +using System; +using System.Runtime.InteropServices; +using System.Runtime.Serialization; + +namespace System.Threading.Tasks +{ + /// <summary> + /// Represents an exception used to communicate task cancellation. + /// </summary> + [Serializable] + public class TaskCanceledException : OperationCanceledException + { + [NonSerialized] + private Task m_canceledTask; // The task which has been canceled. + + /// <summary> + /// Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskCanceledException"/> class. + /// </summary> + public TaskCanceledException() : base(SR.TaskCanceledException_ctor_DefaultMessage) + { + } + + /// <summary> + /// Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskCanceledException"/> + /// class with a specified error message. + /// </summary> + /// <param name="message">The error message that explains the reason for the exception.</param> + public TaskCanceledException(string message) : base(message) + { + } + + /// <summary> + /// Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskCanceledException"/> + /// class with a specified error message and a reference to the inner exception that is the cause of + /// this exception. + /// </summary> + /// <param name="message">The error message that explains the reason for the exception.</param> + /// <param name="innerException">The exception that is the cause of the current exception.</param> + public TaskCanceledException(string message, Exception innerException) : base(message, innerException) + { + } + + /// <summary> + /// Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskCanceledException"/> class + /// with a reference to the <see cref="T:System.Threading.Tasks.Task"/> that has been canceled. + /// </summary> + /// <param name="task">A task that has been canceled.</param> + public TaskCanceledException(Task task) : + base(SR.TaskCanceledException_ctor_DefaultMessage, task != null ? task.CancellationToken : new CancellationToken()) + { + m_canceledTask = task; + } + + /// <summary> + /// Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskCanceledException"/> + /// class with serialized data. + /// </summary> + /// <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> that holds the serialized object data about the exception being thrown.</param> + /// <param name="context">The <see cref="T:System.Runtime.Serialization.StreamingContext"/> that contains contextual information about the source or destination. </param> + protected TaskCanceledException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + + /// <summary> + /// Gets the task associated with this exception. + /// </summary> + /// <remarks> + /// It is permissible for no Task to be associated with a + /// <see cref="T:System.Threading.Tasks.TaskCanceledException"/>, in which case + /// this property will return null. + /// </remarks> + public Task Task + { + get { return m_canceledTask; } + } + } +} diff --git a/src/mscorlib/shared/System/Threading/Tasks/TaskExtensions.cs b/src/mscorlib/shared/System/Threading/Tasks/TaskExtensions.cs new file mode 100644 index 0000000000..1098299517 --- /dev/null +++ b/src/mscorlib/shared/System/Threading/Tasks/TaskExtensions.cs @@ -0,0 +1,48 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace System.Threading.Tasks +{ + /// <summary>Provides a set of static methods for working with specific kinds of <see cref="Task"/> instances.</summary> + public static class TaskExtensions + { + /// <summary>Creates a proxy <see cref="Task"/> that represents the asynchronous operation of a <see cref="Task{Task}"/>.</summary> + /// <param name="task">The <see cref="Task{Task}"/> to unwrap.</param> + /// <returns>A <see cref="Task"/> that represents the asynchronous operation of the provided <see cref="Task{Task}"/>.</returns> + public static Task Unwrap(this Task<Task> task) + { + if (task == null) + { + throw new ArgumentNullException(nameof(task)); + } + + // If the task hasn't completed or was faulted/canceled, wrap it in an unwrap promise. Otherwise, + // it completed successfully. Return its inner task to avoid unnecessary wrapping, or if the inner + // task is null, return a canceled task to match the same semantics as CreateUnwrapPromise. + return + !task.IsRanToCompletion ? Task.CreateUnwrapPromise<VoidTaskResult>(task, lookForOce: false) : + task.Result ?? + Task.FromCanceled(new CancellationToken(true)); + } + + /// <summary>Creates a proxy <see cref="Task{TResult}"/> that represents the asynchronous operation of a <see cref="Task{Task{TResult}}"/>.</summary> + /// <param name="task">The <see cref="Task{Task{TResult}}"/> to unwrap.</param> + /// <returns>A <see cref="Task{TResult}"/> that represents the asynchronous operation of the provided <see cref="Task{Task{TResult}}"/>.</returns> + public static Task<TResult> Unwrap<TResult>(this Task<Task<TResult>> task) + { + if (task == null) + { + throw new ArgumentNullException(nameof(task)); + } + + // If the task hasn't completed or was faulted/canceled, wrap it in an unwrap promise. Otherwise, + // it completed successfully. Return its inner task to avoid unnecessary wrapping, or if the inner + // task is null, return a canceled task to match the same semantics as CreateUnwrapPromise. + return + !task.IsRanToCompletion ? Task.CreateUnwrapPromise<TResult>(task, lookForOce: false) : + task.Result ?? + Task.FromCanceled<TResult>(new CancellationToken(true)); + } + } +} diff --git a/src/mscorlib/shared/System/Threading/Tasks/TaskSchedulerException.cs b/src/mscorlib/shared/System/Threading/Tasks/TaskSchedulerException.cs new file mode 100644 index 0000000000..148b6300ef --- /dev/null +++ b/src/mscorlib/shared/System/Threading/Tasks/TaskSchedulerException.cs @@ -0,0 +1,77 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +// =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ +// +// +// +// An exception for task schedulers. +// +// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + +using System; +using System.Runtime.InteropServices; +using System.Runtime.Serialization; + +namespace System.Threading.Tasks +{ + /// <summary> + /// Represents an exception used to communicate an invalid operation by a + /// <see cref="T:System.Threading.Tasks.TaskScheduler"/>. + /// </summary> + [Serializable] + public class TaskSchedulerException : Exception + { + /// <summary> + /// Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskSchedulerException"/> class. + /// </summary> + public TaskSchedulerException() : base(SR.TaskSchedulerException_ctor_DefaultMessage) // + { + } + + /// <summary> + /// Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskSchedulerException"/> + /// class with a specified error message. + /// </summary> + /// <param name="message">The error message that explains the reason for the exception.</param> + public TaskSchedulerException(string message) : base(message) + { + } + + /// <summary> + /// Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskSchedulerException"/> + /// class using the default error message and a reference to the inner exception that is the cause of + /// this exception. + /// </summary> + /// <param name="innerException">The exception that is the cause of the current exception.</param> + public TaskSchedulerException(Exception innerException) + : base(SR.TaskSchedulerException_ctor_DefaultMessage, innerException) + { + } + + /// <summary> + /// Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskSchedulerException"/> + /// class with a specified error message and a reference to the inner exception that is the cause of + /// this exception. + /// </summary> + /// <param name="message">The error message that explains the reason for the exception.</param> + /// <param name="innerException">The exception that is the cause of the current exception.</param> + public TaskSchedulerException(string message, Exception innerException) : base(message, innerException) + { + } + + /// <summary> + /// Initializes a new instance of the <see cref="T:System.Threading.Tasks.TaskSchedulerException"/> + /// class with serialized data. + /// </summary> + /// <param name="info">The <see cref="T:System.Runtime.Serialization.SerializationInfo"/> that holds + /// the serialized object data about the exception being thrown.</param> + /// <param name="context">The <see cref="T:System.Runtime.Serialization.StreamingContext"/> that + /// contains contextual information about the source or destination. </param> + protected TaskSchedulerException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + } +} |