using System.Threading.Tasks;
public static async Task Main()
await ExecuteActionAsync(Console.WriteLine, 42);
var res = await ExecuteFuncAsync(_ => _, 42);
static Task ExecuteActionAsync<TState>(
return Task.Factory.StartNew(static args =>
var local = (ValueTuple<TState, Action<TState>>)args;
local.Item2(local.Item1);
static Task<TResult> ExecuteFuncAsync<TState, TResult>(
Func<TState, TResult> callback,
return Task.Factory.StartNew<TResult>(static args =>
var local = (ValueTuple<TState, Func<TState, TResult>>)args;
var (localCallback, localState) = (local.Item2, local.Item1);
return localCallback(localState);