using System; using System.Threading; using System.Threading.Tasks; namespace ZeroLevel.Services.Async { public static class AsyncHelper { private static readonly TaskFactory _taskFactory = new TaskFactory(CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default); public static TResult RunSync<TResult>(Func<Task<TResult>> func) => _taskFactory .StartNew(func) .Unwrap() .GetAwaiter() .GetResult(); public static void RunSync(Func<Task> func) => _taskFactory .StartNew(func) .Unwrap() .GetAwaiter() .GetResult(); public async static Task<T> WithTimeout<T>(this Task<T> task, int duration) { var retTask = await Task.WhenAny(task, Task.Delay(duration)) .ConfigureAwait(false); if (retTask is Task<T>) return task.Result; return default(T); } } }