public static async Task <T> RunOnUIThreadAsync <T>(this Func <Task <T> > func)
        {
            var tcs = new TaskCompletionSource <T>();

            System.Action action = async() =>
            {
                try
                {
                    var result = await func();

                    tcs.SetResult(result);
                }
                catch (Exception ex)
                {
                    tcs.SetException(ex);
                }
            };
            await action.OnUIThreadAsync();

            return(await tcs.Task);
        }
        public static async Task RunOnUIThreadAsync(this Func <Task> func)
        {
            var tcs = new TaskCompletionSource <bool>();

            System.Action action = async() =>
            {
                try
                {
                    await func();

                    tcs.SetResult(true);
                }
                catch (Exception ex)
                {
                    tcs.SetException(ex);
                }
            };
            await action.OnUIThreadAsync();

            await tcs.Task;
        }