/// <summary> /// Attempts to complete a <see cref="TaskCompletionSource{TResult}"/> with the specified value, forcing all continuations onto a threadpool thread even if they specified <c>ExecuteSynchronously</c>. /// </summary> /// <typeparam name="TResult">The type of the result of the asynchronous operation.</typeparam> /// <param name="this">The task completion source. May not be <c>null</c>.</param> /// <param name="result">The result of the asynchronous operation.</param> public static void TrySetResultWithBackgroundContinuations <TResult>(this TaskCompletionSource <TResult> @this, TResult result) { // Set the result on a threadpool thread, so any synchronous continuations will execute in the background. TaskShim.Run(() => @this.TrySetResult(result)); // Wait for the TCS task to complete; note that the continuations may not be complete. @this.Task.Wait(); }
/// <summary> /// Attempts to complete a <see cref="TaskCompletionSource"/> as faulted, forcing all continuations onto a threadpool thread even if they specified <c>ExecuteSynchronously</c>. /// </summary> /// <param name="this">The task completion source. May not be <c>null</c>.</param> /// <param name="exceptions">The exceptions to bind to the task.</param> public static void TrySetExceptionWithBackgroundContinuations(this TaskCompletionSource @this, IEnumerable <Exception> exceptions) { // Set the result on a threadpool thread, so any synchronous continuations will execute in the background. TaskShim.Run(() => @this.TrySetException(exceptions)); // Wait for the TCS task to complete; note that the continuations may not be complete. try { @this.Task.Wait(); } catch (AggregateException) { } }
/// <summary> /// Attempts to complete a <see cref="TaskCompletionSource{TResult}"/> as canceled, forcing all continuations onto a threadpool thread even if they specified <c>ExecuteSynchronously</c>. /// </summary> /// <typeparam name="TResult">The type of the result of the asynchronous operation.</typeparam> /// <param name="this">The task completion source. May not be <c>null</c>.</param> public static void TrySetCanceledWithBackgroundContinuations <TResult>(this TaskCompletionSource <TResult> @this) { // Complete on a threadpool thread, so any synchronous continuations will execute in the background. TaskShim.Run(() => @this.TrySetCanceled()); // Wait for the TCS task to complete; note that the continuations may not be complete. try { @this.Task.Wait(); } catch (AggregateException) { } }