示例#1
0
        public async void prefetchImage(string uriString, int requestId, IPromise promise)
        {
            if (string.IsNullOrEmpty(uriString))
            {
                promise.Reject(ErrorInvalidUri, "Cannot prefetch an image for an empty URI.");
                return;
            }

            try
            {
                var imagePipeline = ImagePipelineFactory.Instance.GetImagePipeline();
                var uri           = new Uri(uriString);

                await _prefetchRequests.AddAndInvokeAsync(
                    requestId,
                    async token => await imagePipeline.PrefetchToDiskCacheAsync(uri, token).ConfigureAwait(false))
                .ConfigureAwait(false);

                promise.Resolve(true);
            }
            catch (Exception ex)
            {
                promise.Reject(ErrorPrefetchFailure, ex.Message);
            }
        }
示例#2
0
        public async void downloadFile(JObject options, IPromise promise)
        {
            var filepath = options.Value <string>("toFile");

            try
            {
                var url             = new Uri(options.Value <string>("fromUrl"));
                var jobId           = options.Value <int>("jobId");
                var headers         = (JObject)options["headers"];
                var progressDivider = options.Value <int>("progressDivider");

                var request = new HttpRequestMessage(HttpMethod.Get, url);
                foreach (var header in headers)
                {
                    request.Headers.Add(header.Key, header.Value.Value <string>());
                }

                await _tasks.AddAndInvokeAsync(jobId, token =>
                                               ProcessRequestAsync(promise, request, filepath, jobId, progressDivider, token));
            }
            catch (Exception ex)
            {
                Reject(promise, filepath, ex);
            }
        }
示例#3
0
        public void prefetchImage(string uriString, int requestId, IPromise promise)
        {
            if (string.IsNullOrEmpty(uriString))
            {
                promise.Reject(ErrorInvalidUri, "Cannot prefetch an image for an empty URI.");
                return;
            }

            DispatcherHelpers.RunOnDispatcher(async() =>
            {
                try
                {
                    var uri = new Uri(uriString);

                    await _prefetchRequests.AddAndInvokeAsync(
                        requestId,
                        async token => await ImageCache.Instance.PreCacheAsync(uri, true, true, token).ConfigureAwait(false))
                    .ConfigureAwait(false);

                    promise.Resolve(true);
                }
                catch (Exception ex)
                {
                    promise.Reject(ErrorPrefetchFailure, ex.Message);
                }
            });
        }
        public async Task TaskCancellationManager_CancelAllTasks_Many()
        {
            var count = 100;

            using (var enter = new CountdownEvent(count))
                using (var exit = new CountdownEvent(count))
                {
                    var mgr = new TaskCancellationManager <int>();

                    var tasks = new List <Task>(count);
                    for (var i = 0; i < count; ++i)
                    {
                        tasks.Add(mgr.AddAndInvokeAsync(i, async token =>
                        {
                            var tcs = new TaskCompletionSource <bool>();
                            using (token.Register(() => tcs.SetResult(true)))
                            {
                                enter.Signal();
                                await tcs.Task;
                                exit.Signal();
                            }
                        }));
                    }

                    Assert.IsTrue(enter.WaitHandle.WaitOne());
                    Assert.AreEqual(count, mgr.PendingOperationCount);
                    mgr.CancelAllTasks();
                    Assert.IsTrue(exit.WaitHandle.WaitOne());
                    await Task.WhenAll(tasks);

                    Assert.AreEqual(0, mgr.PendingOperationCount);
                }
        }
        public async Task TaskCancellationManager_CancelledAfterCompleted()
        {
            var mgr = new TaskCancellationManager <int>();
            await mgr.AddAndInvokeAsync(42, _ => Task.CompletedTask);

            mgr.Cancel(42);

            // Not throwing implies success
        }
        public async Task TaskCancellationManager_CleanedUpAfterComplete()
        {
            using (var enter = new AutoResetEvent(false))
            {
                var mgr = new TaskCancellationManager <int>();
                var t   = mgr.AddAndInvokeAsync(42, token =>
                {
                    return(Task.Run(() =>
                    {
                        enter.WaitOne();
                    }));
                });

                Assert.IsNotNull(t);
                Assert.AreEqual(1, mgr.PendingOperationCount);
                enter.Set();
                await t;
                Assert.AreEqual(0, mgr.PendingOperationCount);
            }
        }
示例#7
0
        public async void downloadFile(JObject options, JObject fileOptions, IPromise promise)
        {
            var filepath = options.Value <string>("toFile");

            try
            {
                var url             = new Uri(options.Value <string>("fromUrl"));
                var jobId           = options.Value <int>("jobId");
                var headers         = (JObject)options["headers"];
                var progressDivider = options.Value <int>("progressDivider");

                var request = new HttpRequestMessage(HttpMethod.Get, url);
                foreach (var header in headers)
                {
                    request.Headers.Add(header.Key, header.Value.Value <string>());
                }

                Stream outputStream;
                using (var fileStream = new FileStream(filepath, FileMode.Create, FileAccess.Write))
                {
                    if (fileOptions.Value <bool>("encrypted"))
                    {
                        var base64Key = fileOptions.Value <string>("passphrase");
                        outputStream = encryptionManager.getCryptoWriteStream(fileStream, base64Key);
                    }
                    else
                    {
                        outputStream = fileStream;
                    }

                    await _tasks.AddAndInvokeAsync(jobId, token => ProcessRequestAsync(promise, request, filepath, jobId, progressDivider, outputStream, token));

                    outputStream.Flush();
                    outputStream.Dispose();
                }
            }
            catch (Exception ex)
            {
                Reject(promise, filepath, ex);
            }
        }
        public async Task TaskCancellationManager_CleanedUpAfterError()
        {
            using (var enter = new AutoResetEvent(false))
            {
                var mgr = new TaskCancellationManager <int>();
                var t   = mgr.AddAndInvokeAsync(42, token =>
                {
                    return(Task.Run(() =>
                    {
                        enter.WaitOne();
                        throw new InvalidOperationException();
                    }));
                });

                Assert.IsNotNull(t);
                Assert.AreEqual(1, mgr.PendingOperationCount);
                enter.Set();
                await AssertEx.ThrowsAsync <InvalidOperationException>(async() => await t);

                Assert.AreEqual(0, mgr.PendingOperationCount);
            }
        }
        public async Task TaskCancellationManager_CancelTask()
        {
            using (var enter = new AutoResetEvent(false))
                using (var exit = new AutoResetEvent(false))
                {
                    var mgr = new TaskCancellationManager <int>();
                    var t   = mgr.AddAndInvokeAsync(42, async token =>
                    {
                        var tcs = new TaskCompletionSource <bool>();
                        using (token.Register(() => tcs.SetResult(true)))
                        {
                            enter.Set();
                            await tcs.Task;
                            exit.Set();
                        }
                    });

                    Assert.IsTrue(enter.WaitOne());
                    mgr.Cancel(42);
                    Assert.IsTrue(exit.WaitOne());
                    await t;
                }
        }