public static T RunAsync <T>(Func <Task <T> > asyncMethod) { if (asyncMethod == null) { throw new ArgumentNullException("asyncMethod"); } var prevCtx = SynchronizationContext.Current; try { var syncCtx = new UnitySynchronizationContext(false); SynchronizationContext.SetSynchronizationContext(syncCtx); var t = asyncMethod(); if (t == null) { throw new InvalidOperationException("No task provided."); } t.ContinueWith(delegate { syncCtx.Complete(); }, TaskScheduler.Default); syncCtx.RunOnCurrentThread(); return(t.GetAwaiter().GetResult()); } finally { SynchronizationContext.SetSynchronizationContext(prevCtx); } }
public static void RunAsync(Action asyncMethod) { if (asyncMethod == null) { throw new ArgumentNullException("asyncMethod"); } var prevCtx = SynchronizationContext.Current; try { var syncCtx = new UnitySynchronizationContext(true); SynchronizationContext.SetSynchronizationContext(syncCtx); syncCtx.OperationStarted(); asyncMethod(); syncCtx.OperationCompleted(); syncCtx.RunOnCurrentThread(); } finally { SynchronizationContext.SetSynchronizationContext(prevCtx); } }