You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/ZeroLevel/Services/Async/TaskCompletionSource.cs

138 lines
6.0 KiB

6 years ago
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace ZeroLevel.Services.Async
{
/// <summary>
/// Represents the producer side of a <see cref="System.Threading.Tasks.Task"/> unbound to a delegate, providing access to the consumer side through the <see cref="Task"/> property.
/// </summary>
public sealed class TaskCompletionSource
{
/// <summary>
/// The underlying TCS.
/// </summary>
private readonly TaskCompletionSource<object> _tcs;
/// <summary>
/// Initializes a new instance of the <see cref="TaskCompletionSource"/> class.
/// </summary>
public TaskCompletionSource()
{
_tcs = new TaskCompletionSource<object>();
}
/// <summary>
/// Initializes a new instance of the <see cref="TaskCompletionSource"/> class with the specified state.
/// </summary>
/// <param name="state">The state to use as the underlying <see cref="Task"/>'s <see cref="IAsyncResult.AsyncState"/>.</param>
public TaskCompletionSource(object state)
{
_tcs = new TaskCompletionSource<object>(state);
}
/// <summary>
/// Initializes a new instance of the <see cref="TaskCompletionSource"/> class with the specified options.
/// </summary>
/// <param name="creationOptions">The options to use when creating the underlying <see cref="Task"/>.</param>
public TaskCompletionSource(TaskCreationOptions creationOptions)
{
_tcs = new TaskCompletionSource<object>(creationOptions);
}
/// <summary>
/// Initializes a new instance of the <see cref="TaskCompletionSource"/> class with the specified state and options.
/// </summary>
/// <param name="state">The state to use as the underlying <see cref="Task"/>'s <see cref="IAsyncResult.AsyncState"/>.</param>
/// <param name="creationOptions">The options to use when creating the underlying <see cref="Task"/>.</param>
public TaskCompletionSource(object state, TaskCreationOptions creationOptions)
{
_tcs = new TaskCompletionSource<object>(state, creationOptions);
}
/// <summary>
/// Gets the <see cref="Task"/> created by this <see cref="TaskCompletionSource"/>.
/// </summary>
public Task Task
{
get { return _tcs.Task; }
}
/// <summary>
/// Transitions the underlying <see cref="Task"/> into the <see cref="TaskStatus.Canceled"/> state.
/// </summary>
/// <exception cref="InvalidOperationException">The underlying <see cref="Task"/> has already been completed.</exception>
public void SetCanceled()
{
_tcs.SetCanceled();
}
/// <summary>
/// Attempts to transition the underlying <see cref="Task"/> into the <see cref="TaskStatus.Canceled"/> state.
/// </summary>
/// <returns><c>true</c> if the operation was successful; otherwise, <c>false</c>.</returns>
public bool TrySetCanceled()
{
return _tcs.TrySetCanceled();
}
/// <summary>
/// Transitions the underlying <see cref="Task"/> into the <see cref="TaskStatus.Faulted"/> state.
/// </summary>
/// <param name="exception">The exception to bind to this <see cref="Task"/>. May not be <c>null</c>.</param>
/// <exception cref="InvalidOperationException">The underlying <see cref="Task"/> has already been completed.</exception>
public void SetException(Exception exception)
{
_tcs.SetException(exception);
}
/// <summary>
/// Transitions the underlying <see cref="Task"/> into the <see cref="TaskStatus.Faulted"/> state.
/// </summary>
/// <param name="exceptions">The collection of exceptions to bind to this <see cref="Task"/>. May not be <c>null</c> or contain <c>null</c> elements.</param>
/// <exception cref="InvalidOperationException">The underlying <see cref="Task"/> has already been completed.</exception>
public void SetException(IEnumerable<Exception> exceptions)
{
_tcs.SetException(exceptions);
}
/// <summary>
/// Attempts to transition the underlying <see cref="Task"/> into the <see cref="TaskStatus.Faulted"/> state.
/// </summary>
/// <param name="exception">The exception to bind to this <see cref="Task"/>. May not be <c>null</c>.</param>
/// <returns><c>true</c> if the operation was successful; otherwise, <c>false</c>.</returns>
public bool TrySetException(Exception exception)
{
return _tcs.TrySetException(exception);
}
/// <summary>
/// Attempts to transition the underlying <see cref="Task"/> into the <see cref="TaskStatus.Faulted"/> state.
/// </summary>
/// <param name="exceptions">The collection of exceptions to bind to this <see cref="Task"/>. May not be <c>null</c> or contain <c>null</c> elements.</param>
/// <returns><c>true</c> if the operation was successful; otherwise, <c>false</c>.</returns>
public bool TrySetException(IEnumerable<Exception> exceptions)
{
return _tcs.TrySetException(exceptions);
}
/// <summary>
/// Transitions the underlying <see cref="Task"/> into the <see cref="TaskStatus.RanToCompletion"/> state.
/// </summary>
/// <exception cref="InvalidOperationException">The underlying <see cref="Task"/> has already been completed.</exception>
public void SetResult()
{
_tcs.SetResult(null);
}
/// <summary>
/// Attempts to transition the underlying <see cref="Task"/> into the <see cref="TaskStatus.RanToCompletion"/> state.
/// </summary>
/// <returns><c>true</c> if the operation was successful; otherwise, <c>false</c>.</returns>
public bool TrySetResult()
{
return _tcs.TrySetResult(null);
}
}
}

Powered by TurnKey Linux.