How do I free/unload local tile cache file?

399
2
02-09-2023 03:46 AM
ViktorSafar
Occasional Contributor II

I have an offline device running a WPF app using VectorTileCache to add ArcGISVectorTiledLayer to the app's map. VectorTileCache loads a .vtpk file from the device's disk.

I have built capability to download a new version of the .vtpk file from a remote source and I would like to reload the ArcGISVectorTiledLayer when the new file is ready.

When I try to replace the old vtpk with the new one, I get an error that the file is in use:

System.IO.IOException: 'The process cannot access the file 'C:\temp\GeocacheKystVector.vtpk' because it is being used by another process.'

The ArcGISVectorTiledLayer that refers the vtpk is an item in Basemap.BaseLayers. I remove the item, run GC, but still get that IOException.

How do I unload the package?

0 Kudos
2 Replies
AndyWeis
Esri Contributor

Hi @ViktorSafar, could you please provide the code used to do this?

0 Kudos
ViktorSafar
Occasional Contributor II

Hi @AndyWeis 

While attempting to make a PoC about this, it turned out I was overcomplicating things.

What I was doing:

  1. load a VTPK file (eg. mymap.vtpk)
  2. download new package to TEMP file
  3. delete current VTPK file (mymap.vtpk)
  4. move TEMP file to mymap.vtpk

The IO Exception was of course happening in step 3 as the file was being used by the application

 

I have now changed it to just directly copy the TEMP file into the current VTPK file 

 

File.Copy(_newPackageFile, _packageFile, overwrite: true);

 

and am getting no exceptions.

However, I am uncertain if this works as intended - aka the map is updated with the new package, as this is hard to check (basemap layers are big 🙂 ).

To test it, I have been using 2 VTPK packages, each containing a different map (visually different):

  • mymap.vtpk (contains a coastal map of Norway)
  • greytone.vtpk (contains a grey tone map of Norway)

I load package1 (mymap.vtpk) into the map on startup, then on button click I copy package2 file into package1 file. No error. The only thing I notice is that the map stops rendering details:

ViktorSafar_0-1679060791553.png

I realize this might not be the best way to test it due to the packages containing different maps.

 

What would be the recommended way to update a local package (that is loaded into the application) while the application is running? Could it be as simple as this?

 

File.Copy(_newPackageFile, _packageFile, overwrite: true);
Map.Basemap.BaseLayers.First().RetryLoadAsync(); // find the appropriate base layer

 

0 Kudos