using System;
using System.Threading.Tasks;
public class Program
{
public static async Task Main()
await ExecuteActionAsync(Console.WriteLine, 42);
var res = await ExecuteFuncAsync(_ => _, 42);
Console.WriteLine(res);
}
static Task ExecuteActionAsync<TState>(
Action<TState> callback,
TState state)
return Task.Factory.StartNew(static args =>
var local = (ValueTuple<TState, Action<TState>>)args;
local.Item2(local.Item1);
}, (state, callback));
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);