public Task <TResult> InvokeAsync <TResult>(Func <TResult> function)
        {
            var completion = new RendererSynchronizationTaskCompletionSource <Func <TResult>, TResult>(function);

            ExecuteSynchronouslyIfPossible(state => {
                var source = (RendererSynchronizationTaskCompletionSource <Func <TResult>, TResult>)state;
                try {
                    var result = source.Callback();
                    source.SetResult(result);
                }
                catch (OperationCanceledException) {
                    source.SetCanceled();
                }
                catch (Exception exception) {
                    source.SetException(exception);
                }
            }, completion);

            return(completion.Task);
        }
        public Task InvokeAsync(Func <Task> asyncAction)
        {
            var completion = new RendererSynchronizationTaskCompletionSource <Func <Task>, object>(asyncAction);

            ExecuteSynchronouslyIfPossible(async state => {
                var completionSource = (RendererSynchronizationTaskCompletionSource <Func <Task>, object>)state;
                try {
                    await completionSource?.Callback();
                    completionSource?.SetResult(null);
                }
                catch (OperationCanceledException) {
                    completionSource?.SetCanceled();
                }
                catch (Exception exception) {
                    completionSource?.SetException(exception);
                }
            }, completion);

            return(completion.Task);
        }