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;
}