NuGet package: https://www.nuget.org/packages/ContextFreeTasks/
Use ContextFreeTask struct instead of Task class (System.Threading.Tasks namespace) for return types of async methods.
private async ContextFreeTask FAsync() { ... } private async ContextFreeTask<T> FAsync<T>() { ... }
These ignore the current synchronization context in the methods.
You do not have to write ConfigureAwait(false) anymore.
In C# 7, async methods may return other types in addition to Task, Task<T> and void.
The returned type must satisfy a certain pattern. These types are called "Task-like".
The ContextFreeTask struct in this library satisfies the "Task-like" pattern and the "awaitable" pattern.
The methods which return ContextFreeTask do not capture the synchronization context.
For example, you can use this as following:
// All awaits in this method don't capture SynchronizationContext private async ContextFreeTask FAsync() { // Whatever current context is await Task.Delay(100); // no context here await Task.Delay(100); // no context here }
This code behaves almost the same as the following:
private async Task FAsync() { await Task.Delay(100).ConfigureAwait(false); await Task.Delay(100).ConfigureAwait(false); }
The ContextFreeTask struct is a thin wrapper of Task class.
public struct ContextFreeTask { public Task Task { get; } }
And the ContextFreeTask<T> is that of Task<T>.
public struct ContextFreeTask<T> { public Task<T> Task { get; } }
Those AsyncMethodBuilders always clear current synchronization context.
public struct AsyncContextFreeTaskMethodBuilder { private AsyncTaskMethodBuilder _methodBuilder; public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine { var prevContext = SynchronizationContext.Current; try { SynchronizationContext.SetSynchronizationContext(null); _methodBuilder.AwaitOnCompleted(ref awaiter, ref stateMachine); } finally { SynchronizationContext.SetSynchronizationContext(prevContext); } } }