public IAsyncResult BeginRetrieve(CacheRequest request, AsyncCallback callback, object state)
        {
            var asyncResult = new CacheAsyncResult()
            {
                AsyncState = state, AsyncWaitHandle = new AutoResetEvent(false)
            };

            Task.Run(async() =>
            {
                asyncResult.Response    = await GetCacheResponseAsync(request.CanonicalUri);
                asyncResult.IsCompleted = true;

                //callback
                if (callback != null)
                {
                    callback(asyncResult);
                }

                //signal the blocked SSME downloader thread waiting in EndRetrieve
                if (asyncResult.AsyncWaitHandle != null)
                {
                    (asyncResult.AsyncWaitHandle as AutoResetEvent).Set();
                }
            });

            return(asyncResult);
        }
        public IAsyncResult BeginRetrieve(CacheRequest request, AsyncCallback callback, object state)
        {
            var asyncResult = new CacheAsyncResult() { AsyncState = state, AsyncWaitHandle = new AutoResetEvent(false) };

            Task.Run(async () =>
            {
                asyncResult.Response = await GetCacheResponseAsync(request.CanonicalUri);
                asyncResult.IsCompleted = true;

                //callback
                if (callback != null)
                {
                    callback(asyncResult);
                }

                //signal the blocked SSME downloader thread waiting in EndRetrieve
                if (asyncResult.AsyncWaitHandle != null)
                {
                    (asyncResult.AsyncWaitHandle as AutoResetEvent).Set();
                }
            });

            return asyncResult;
        }