Nito.AsyncEx.AwaitableDisposable<T>
An awaitable wrapper around a task whose result is disposable. The wrapper is not disposable, so this prevents usage errors like "using (MyAsync())" when the appropriate usage should be "using (await MyAsync())".
namespace Nito.AsyncEx
{
public struct AwaitableDisposable<T> where T : IDisposable
{
public AwaitableDisposable(Task<T> task);
public Task<T> AsTask();
public static implicit operator Task<T>(AwaitableDisposable<T> source);
public TaskAwaiter<T> GetAwaiter();
public ConfiguredTaskAwaitable<T> ConfigureAwait(bool continueOnCapturedContext);
}
}