StreetFoo.Client.ReportImageCacheManager.EnqueueImageDownload C# (CSharp) Method

EnqueueImageDownload() private method

private EnqueueImageDownload ( ReportViewItem viewItem ) : void
viewItem ReportViewItem
return void
        internal void EnqueueImageDownload(ReportViewItem viewItem)
        {
            Debug.WriteLine(string.Format("Enqueuing download for '{0}'...", viewItem.NativeId));

            // create a new task...
            Task<Task<string>>.Factory.StartNew(async () =>
            {
                Debug.WriteLine(string.Format("Requesting image for '{0}'...", viewItem.NativeId));

                // load...
                var proxy = ServiceProxyFactory.Current.GetHandler<IGetReportImageServiceProxy>();
                var result = await proxy.GetReportImageAsync(viewItem.NativeId);

                // check...
                result.AssertNoErrors();

                // create the new file...
                var filename = GetCacheFilename(viewItem);
                var cacheFolder = await this.GetCacheFolderAsync();
                var cacheFile = await cacheFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
                using (var stream = await cacheFile.OpenStreamForWriteAsync())
                    stream.Write(result.ImageBytes, 0, result.ImageBytes.Length);

                // get the URL...
                string url = this.CalculateLocalImageUrl(viewItem);
                Debug.WriteLine(string.Format("Image load for '{0}' finished.", viewItem.NativeId));
                return url;

            }).ContinueWith(async (t) =>
            {
                // send it back...
                Debug.WriteLine(string.Format("Setting image for '{0}'...", viewItem.NativeId));
                viewItem.ImageUri = (await t).Result;

            }, TaskScheduler.FromCurrentSynchronizationContext());
        }

Usage Example

Example #1
0
        internal async Task InitializeAsync(ReportImageCacheManager manager)
        {
            // get...
            var imageUrl = await manager.GetLocalImageUriAsync(this);

            if (!(string.IsNullOrEmpty(imageUrl)))
            {
                // set it up...
                this.ImageUri = imageUrl;
            }
            else
            {
                // enqueue an image...
                manager.EnqueueImageDownload(this);
            }
        }