private static Task <T> FromAsync <T>(Func <AsyncCallback, IAsyncResult> begin, Func <IAsyncResult, T> end)
        {
            var tcs = new DispatchingTaskCompletionSource <T>();

            try
            {
                var result = begin(ar =>
                {
                    if (!ar.CompletedSynchronously)
                    {
                        CompleteAsync(tcs, ar, end);
                    }
                });

                if (result.CompletedSynchronously)
                {
                    CompleteAsync(tcs, result, end);
                }
            }
            catch (Exception ex)
            {
                tcs.TrySetException(ex);
            }

            return(tcs.Task);
        }
 private static void CompleteAsync <T>(DispatchingTaskCompletionSource <T> tcs, IAsyncResult ar, Func <IAsyncResult, T> end)
 {
     try
     {
         tcs.TrySetResult(end(ar));
     }
     catch (OperationCanceledException)
     {
         tcs.TrySetCanceled();
     }
     catch (Exception ex)
     {
         tcs.TrySetException(ex);
     }
 }