SuperMap.WindowsPhone.Mapping.TiledLayer.GetImage C# (CSharp) Method

GetImage() private method

private GetImage ( Tile tile ) : Task
tile Tile
return Task
        private async Task<Tile> GetImage(Tile tile)
        {
            if (!string.IsNullOrEmpty(tile.TileKey))
            {
                try
                {
                    tile.CancellationTokenSource = new CancellationTokenSource(5000);

                    tile.MapImage = await Task.Run<MapImage>(() => GetTile(tile.Column, tile.Row, tile.Level, tile.Resolution, tile.CancellationTokenSource.Token)).AsAsyncOperation<MapImage>();
                    if (tile.CancellationTokenSource.IsCancellationRequested)
                    {
                        tile.CancellationTokenSource.Token.ThrowIfCancellationRequested();
                    }
                    if (tile.MapImage.MapImageType == MapImageType.Url)
                    {
                        HttpWebRequest request = HttpWebRequest.CreateHttp(tile.MapImage.Url);
                        TaskFactory factory = new TaskFactory(tile.CancellationTokenSource.Token);
                        tile.CancellationTokenSource.Token.Register(() =>
                            {
                                request.Abort();
                            });
                        using (HttpWebResponse response = (HttpWebResponse)await factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null))
                        {
                            if (tile.CancellationTokenSource.IsCancellationRequested)
                            {
                                tile.CancellationTokenSource.Token.ThrowIfCancellationRequested();
                            }
                            using (MemoryStream memoryStream = new MemoryStream(0x10000))
                            {
                                using (Stream responseStream = response.GetResponseStream())
                                {
                                    byte[] temp = new byte[0x1000];
                                    int bytes;
                                    while ((bytes = responseStream.Read(temp, 0, temp.Length)) > 0)
                                    {
                                        memoryStream.Write(temp, 0, bytes);
                                    }
                                    responseStream.Close();
                                }
                                tile.MapImage.Data = memoryStream.ToArray();
                            }
                        }
                    }
                    if (tile.MapImage.Data != null && tile.MapImage.Data.Length > 0)
                    {
                        tile.IsSuccessd = true;
                    }
                    return tile;
                }
                catch (Exception ex)
                {
                    //出现异常。
                    return tile;
                }
                finally
                {
                    if (tile.CancellationTokenSource != null)
                    {
                        if (tile.CancellationTokenSource.IsCancellationRequested)
                        {
                            tile.IsCanceled = true;
                        }
                        tile.CancellationTokenSource.Dispose();
                        tile.CancellationTokenSource = null;
                    }
                }
            }
            return null;
        }