private static Task DisposeSourceWhenCompleteAsync(Task task, Stream source)
{
switch (task.Status)
{
case TaskStatus.RanToCompletion:
DisposeSource(source);
return Task.CompletedTask;
case TaskStatus.Faulted:
case TaskStatus.Canceled:
return task;
default:
return task.ContinueWith((completed, innerSource) =>
{
completed.GetAwaiter().GetResult(); // propagate any exceptions
DisposeSource((Stream)innerSource);
},
source, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously | TaskContinuationOptions.DenyChildAttach, TaskScheduler.Default);
}
}