Example #1
0
        /// <summary>
        /// Executes the specified <paramref name="func"/> on the <paramref name="synchronizationContext"/> and returns the result
        /// </summary>
        /// <typeparam name="TResult">The return type of <paramref name="func"/></typeparam>
        /// <param name="synchronizationContext">The <see cref="SynchronizationContext"/></param>
        /// <param name="func">The <see cref="Func{TResult}"/></param>
        /// <returns>The result of <paramref name="func"/></returns>
        public static Task <TResult> ExecuteAsync <TResult>(this SynchronizationContext synchronizationContext, Func <TResult> func)
        {
            if (synchronizationContext == null || SynchronizationContext.Current == synchronizationContext)
            {
                return(Task.FromResult(func()));
            }
            var completion = new TaskCompletionSource <TResult>();

            synchronizationContext.Post(state => completion.AttemptSetResult(func), null);
            return(completion.Task);
        }
Example #2
0
        /// <summary>
        /// Executes the specified <paramref name="action"/> on the specified <paramref name="synchronizationContext"/>
        /// </summary>
        /// <param name="synchronizationContext">The <see cref="SynchronizationContext"/></param>
        /// <param name="action">The <see cref="Action"/></param>
        public static Task ExecuteAsync(this SynchronizationContext synchronizationContext, Action action)
        {
            if (synchronizationContext == null || SynchronizationContext.Current == synchronizationContext)
            {
                action();
                return(Task.CompletedTask);
            }
            var completion = new TaskCompletionSource <object>();

            synchronizationContext.Post(state => completion.AttemptSetResult(action), null);
            return(completion.Task);
        }