Index: Core/Components/src/Core.Components.BruTile.IO/AsyncTileFetcher.cs =================================================================== diff -u -r99f9004206bfb9de084275d749b7aeccafd6da18 -ra8cff57ee058757f8c0b4a30b181a9dc3534718e --- Core/Components/src/Core.Components.BruTile.IO/AsyncTileFetcher.cs (.../AsyncTileFetcher.cs) (revision 99f9004206bfb9de084275d749b7aeccafd6da18) +++ Core/Components/src/Core.Components.BruTile.IO/AsyncTileFetcher.cs (.../AsyncTileFetcher.cs) (revision a8cff57ee058757f8c0b4a30b181a9dc3534718e) @@ -21,6 +21,7 @@ using System; using System.Collections.Concurrent; +using System.IO; using System.Threading; using Amib.Threading; using BruTile; @@ -93,11 +94,18 @@ { ThrowExceptionIfDisposed(); - byte[] res = GetTileFromCache(tileInfo); - if (res != null) + try { - return res; + byte[] res = GetTileFromCache(tileInfo); + if (res != null) + { + return res; + } } + catch (IOException) + { + return null; + } ScheduleTileRequest(tileInfo); return null; Index: Core/Components/test/Core.Components.BruTile.IO.Test/AsyncTileFetcherTest.cs =================================================================== diff -u -r99f9004206bfb9de084275d749b7aeccafd6da18 -ra8cff57ee058757f8c0b4a30b181a9dc3534718e --- Core/Components/test/Core.Components.BruTile.IO.Test/AsyncTileFetcherTest.cs (.../AsyncTileFetcherTest.cs) (revision 99f9004206bfb9de084275d749b7aeccafd6da18) +++ Core/Components/test/Core.Components.BruTile.IO.Test/AsyncTileFetcherTest.cs (.../AsyncTileFetcherTest.cs) (revision a8cff57ee058757f8c0b4a30b181a9dc3534718e) @@ -20,6 +20,7 @@ // All rights reserved. using System; +using System.IO; using System.Threading; using BruTile; using BruTile.Cache; @@ -243,6 +244,41 @@ } [Test] + public void GetTile_TileInPersistentCacheInUse_ReturnNull() + { + // Setup + var info = new TileInfo(); + var data = new byte[0]; + + var mocks = new MockRepository(); + var tileProvider = mocks.Stub(); + tileProvider.Stub(tp => tp.GetTile(info)).Return(data); + + var persistentCache = mocks.Stub>(); + persistentCache.Stub(c => c.Find(info.Index)).Throw(new IOException()); + mocks.ReplayAll(); + + using (var fetcherFiredAsyncEvent = new AutoResetEvent(false)) + using (var fetcher = new AsyncTileFetcher(tileProvider, 100, 200, persistentCache)) + { + fetcher.TileReceived += (sender, args) => { fetcherFiredAsyncEvent.Set(); }; + fetcher.QueueEmpty += (sender, args) => { fetcherFiredAsyncEvent.Set(); }; + + byte[] fetchedData = fetcher.GetTile(info); + + // Assert + Assert.IsNull(fetchedData); + + if (fetcherFiredAsyncEvent.WaitOne(allowedTileFetchTime)) + { + Assert.Fail("TileFetcher should not fire asynchronous events if tile is retrieved from cache."); + } + + mocks.VerifyAll(); + } + } + + [Test] public void GetTile_TileFetcherDisposed_ThrowObjectDisposedException() { // Setup