Version 4.12.2 Minor changes in TileImageLoader.

This commit is contained in:
ClemensF 2019-06-08 23:18:33 +02:00
parent 0c0a0ae511
commit 8491a4fc7c
16 changed files with 70 additions and 81 deletions

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")] [assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("4.12.1")] [assembly: AssemblyVersion("4.12.2")]
[assembly: AssemblyFileVersion("4.12.1")] [assembly: AssemblyFileVersion("4.12.2")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: ComVisible(false)] [assembly: ComVisible(false)]

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")] [assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("4.12.1")] [assembly: AssemblyVersion("4.12.2")]
[assembly: AssemblyFileVersion("4.12.1")] [assembly: AssemblyFileVersion("4.12.2")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: ComVisible(false)] [assembly: ComVisible(false)]

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")] [assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("4.12.1")] [assembly: AssemblyVersion("4.12.2")]
[assembly: AssemblyFileVersion("4.12.1")] [assembly: AssemblyFileVersion("4.12.2")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: ComVisible(false)] [assembly: ComVisible(false)]

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")] [assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("4.12.1")] [assembly: AssemblyVersion("4.12.2")]
[assembly: AssemblyFileVersion("4.12.1")] [assembly: AssemblyFileVersion("4.12.2")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: ComVisible(false)] [assembly: ComVisible(false)]

View file

@ -63,71 +63,66 @@ namespace MapControl
if (tileSource != null && tiles.Any()) if (tileSource != null && tiles.Any())
{ {
if (Cache == null || tileSource.UriFormat == null || !tileSource.UriFormat.StartsWith("http"))
{
sourceName = null; // do not use cache
}
pendingTiles.PushRange(tiles.Reverse().ToArray()); pendingTiles.PushRange(tiles.Reverse().ToArray());
Func<Tile, Task> loadFunc;
if (Cache != null && !string.IsNullOrEmpty(sourceName) &&
tileSource.UriFormat != null && tileSource.UriFormat.StartsWith("http"))
{
loadFunc = tile => LoadCachedTileImageAsync(tile, tileSource, sourceName);
}
else
{
loadFunc = tile => LoadTileImageAsync(tile, tileSource);
}
var newTasks = Math.Min(pendingTiles.Count, MaxLoadTasks) - taskCount; var newTasks = Math.Min(pendingTiles.Count, MaxLoadTasks) - taskCount;
while (--newTasks >= 0) while (--newTasks >= 0)
{ {
Interlocked.Increment(ref taskCount); Interlocked.Increment(ref taskCount);
var task = Task.Run(() => LoadTilesAsync(loadFunc)); // do not await Task.Run(async () => // do not await
} {
Tile tile;
//Debug.WriteLine("{0}: {1} tasks", Environment.CurrentManagedThreadId, taskCount); while (pendingTiles.TryPop(out tile))
{
tile.Pending = false;
try
{
await LoadTileImageAsync(tile, tileSource, sourceName);
}
catch (Exception ex)
{
Debug.WriteLine("TileImageLoader: {0}/{1}/{2}: {3}", tile.ZoomLevel, tile.XIndex, tile.Y, ex.Message);
}
}
Interlocked.Decrement(ref taskCount);
});
}
} }
} }
private async Task LoadTilesAsync(Func<Tile, Task> loadTileImageFunc) private async Task LoadTileImageAsync(Tile tile, TileSource tileSource, string sourceName)
{ {
Tile tile; if (string.IsNullOrEmpty(sourceName))
while (pendingTiles.TryPop(out tile))
{ {
tile.Pending = false; await LoadTileImageAsync(tile, tileSource);
try
{
await loadTileImageFunc(tile);
}
catch (Exception ex)
{
Debug.WriteLine("TileImageLoader: {0}/{1}/{2}: {3}", tile.ZoomLevel, tile.XIndex, tile.Y, ex.Message);
}
} }
else
Interlocked.Decrement(ref taskCount);
//Debug.WriteLine("{0}: {1} tasks", Environment.CurrentManagedThreadId, taskCount);
}
private async Task LoadCachedTileImageAsync(Tile tile, TileSource tileSource, string sourceName)
{
var uri = tileSource.GetUri(tile.XIndex, tile.Y, tile.ZoomLevel);
if (uri != null)
{ {
var extension = Path.GetExtension(uri.LocalPath); var uri = tileSource.GetUri(tile.XIndex, tile.Y, tile.ZoomLevel);
if (string.IsNullOrEmpty(extension) || extension == ".jpeg") if (uri != null)
{ {
extension = ".jpg"; var extension = Path.GetExtension(uri.LocalPath);
if (string.IsNullOrEmpty(extension) || extension == ".jpeg")
{
extension = ".jpg";
}
var cacheKey = string.Format(CacheKeyFormat, sourceName, tile.ZoomLevel, tile.XIndex, tile.Y, extension);
await LoadTileImageAsync(tile, uri, cacheKey);
} }
var cacheKey = string.Format(CacheKeyFormat, sourceName, tile.ZoomLevel, tile.XIndex, tile.Y, extension);
await LoadCachedTileImageAsync(tile, uri, cacheKey);
} }
} }

View file

@ -110,15 +110,9 @@ namespace MapControl
/// </summary> /// </summary>
public virtual async Task<ImageSource> LoadImageAsync(int x, int y, int zoomLevel) public virtual async Task<ImageSource> LoadImageAsync(int x, int y, int zoomLevel)
{ {
ImageSource imageSource = null;
var uri = GetUri(x, y, zoomLevel); var uri = GetUri(x, y, zoomLevel);
if (uri != null) return uri != null ? await ImageLoader.LoadImageAsync(uri) : null;
{
imageSource = await ImageLoader.LoadImageAsync(uri);
}
return imageSource;
} }
private string GetDefaultUri(int x, int y, int zoomLevel) private string GetDefaultUri(int x, int y, int zoomLevel)

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")] [assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("4.12.1")] [assembly: AssemblyVersion("4.12.2")]
[assembly: AssemblyFileVersion("4.12.1")] [assembly: AssemblyFileVersion("4.12.2")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: ComVisible(false)] [assembly: ComVisible(false)]

View file

@ -26,7 +26,7 @@ namespace MapControl
/// </summary> /// </summary>
public static Caching.IImageCache Cache { get; set; } public static Caching.IImageCache Cache { get; set; }
private async Task LoadCachedTileImageAsync(Tile tile, Uri uri, string cacheKey) private async Task LoadTileImageAsync(Tile tile, Uri uri, string cacheKey)
{ {
var cacheItem = await Cache.GetAsync(cacheKey); var cacheItem = await Cache.GetAsync(cacheKey);
var cacheBuffer = cacheItem?.Buffer; var cacheBuffer = cacheItem?.Buffer;
@ -47,7 +47,7 @@ namespace MapControl
} }
} }
if (cacheBuffer != null) if (cacheBuffer != null) // cached image not expired or download failed
{ {
await LoadTileImageAsync(tile, cacheBuffer); await LoadTileImageAsync(tile, cacheBuffer);
} }

View file

@ -8,8 +8,8 @@ using System.Windows;
[assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")] [assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("4.12.1")] [assembly: AssemblyVersion("4.12.2")]
[assembly: AssemblyFileVersion("4.12.1")] [assembly: AssemblyFileVersion("4.12.2")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: ComVisible(false)] [assembly: ComVisible(false)]

View file

@ -28,7 +28,7 @@ namespace MapControl
/// </summary> /// </summary>
public static ObjectCache Cache { get; set; } = MemoryCache.Default; public static ObjectCache Cache { get; set; } = MemoryCache.Default;
private async Task LoadCachedTileImageAsync(Tile tile, Uri uri, string cacheKey) private async Task LoadTileImageAsync(Tile tile, Uri uri, string cacheKey)
{ {
DateTime expiration; DateTime expiration;
var cacheBuffer = GetCachedImage(cacheKey, out expiration); var cacheBuffer = GetCachedImage(cacheKey, out expiration);
@ -52,7 +52,7 @@ namespace MapControl
} }
} }
if (cacheBuffer != null) if (cacheBuffer != null) // cached image not expired or download failed
{ {
using (var stream = new MemoryStream(cacheBuffer)) using (var stream = new MemoryStream(cacheBuffer))
{ {

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")] [assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("4.12.1")] [assembly: AssemblyVersion("4.12.2")]
[assembly: AssemblyFileVersion("4.12.1")] [assembly: AssemblyFileVersion("4.12.2")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: ComVisible(false)] [assembly: ComVisible(false)]

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")] [assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("4.12.1")] [assembly: AssemblyVersion("4.12.2")]
[assembly: AssemblyFileVersion("4.12.1")] [assembly: AssemblyFileVersion("4.12.2")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: ComVisible(false)] [assembly: ComVisible(false)]

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")] [assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("4.12.1")] [assembly: AssemblyVersion("4.12.2")]
[assembly: AssemblyFileVersion("4.12.1")] [assembly: AssemblyFileVersion("4.12.2")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: ComVisible(false)] [assembly: ComVisible(false)]

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")] [assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("4.12.1")] [assembly: AssemblyVersion("4.12.2")]
[assembly: AssemblyFileVersion("4.12.1")] [assembly: AssemblyFileVersion("4.12.2")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: ComVisible(false)] [assembly: ComVisible(false)]

View file

@ -8,7 +8,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")] [assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("4.12.1")] [assembly: AssemblyVersion("4.12.2")]
[assembly: AssemblyFileVersion("4.12.1")] [assembly: AssemblyFileVersion("4.12.2")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: ComVisible(false)] [assembly: ComVisible(false)]

View file

@ -7,8 +7,8 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCompany("Clemens Fischer")]
[assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")] [assembly: AssemblyCopyright("Copyright © 2019 Clemens Fischer")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyVersion("4.12.1")] [assembly: AssemblyVersion("4.12.2")]
[assembly: AssemblyFileVersion("4.12.1")] [assembly: AssemblyFileVersion("4.12.2")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: ComVisible(false)] [assembly: ComVisible(false)]