

So that code sample will work, but if I remove the GC.Collect() call from the DisposeReaderAndSwitchFiles method I get the UnauthorizedAccessException. Thread t = new Thread(DisposeReaderAndSwitchFiles) Ĭonsole.WriteLine("Press Any Key To Continue.") _cityReader = new FileAccessMode.MemoryMapped) Try switching in the main method of the console app I have this. private static void DisposeReaderAndSwitchFiles() To reproduce this one, I have a static method in the console app like this. In this scenario I find that I need to force a garbage collection after disposing of the _cityReader variable and setting it to null. _cityReader = on top of this, I actually dispose of the static reader object on a different thread to the one it was created on and find that even doing this bit with reflection under that scenario means I still get the UnauthorizedAccessException. ThreadLocal fieldValue = (ThreadLocal)field.GetValue(_cityReader) _cityReader = new FileAccessMode.MemoryMapped) įieldInfo field = typeof(Reader).GetField("_stream", BindingFlags.NonPublic | BindingFlags.Instance) _cityReader = I've found is that if I use reflection to call Dispose the _cityReader._stream.Value property then in this scenario before calling dispose on the _cityReader variable itself then the file will delete.

Now, if you set the _cityReader variable to a new instance of the Reader then call dispose on it (I also set it to null) then move the file (moving works fine) then call delete on the file's new location you will get an UnauthorizedAccessException on the delete operation. The simplest way to reproduce this issue is to have a console application, similar to the MaxMind.Db.Benchmark project, which has a static instance of the Reader class, in my case called _cityReader. Object and sharing that among threads.I am using the MaxMind.Db.Reader class to access the GeoLite2-City.mmdb file and I am having file access issues performing certain actions on the file after calling dispose on the reader. When using theĭatabaseReader in a multi-threaded application, we suggest creating one This API fully supports use in multi-threaded applications. - Continent.Code or Continent.GeoNameId.

We strongly discourage you from using a value from any Names property as Values to use for Database or Dictionary Keys This exception also is the parent exception to theĪbove exceptions. Returns any status code besides 200, 4xx, or 5xx, this also becomes aįinally, if the web service returns a 200 but the body is invalid, the client Returning a 500 or an invalid error document. Thrown when some sort of unanticipated error occurs, such as the web service If some sort of transport error occurs, an HttpException is thrown. InvalidRequestException, or a OutOfQueriesException. If the web service returns an explicit error document, this is thrown as aĪddressNotFoundException, a AuthenticationException, a Web Serviceįor details on the possible errors returned by the web service itself, see If an address is not available in the database, aĪddressNotFoundException will be thrown. MaxMind.Db.InvalidDatabaseException will be thrown. If the database is corrupt or otherwise invalid, a using ( var client = new WebServiceClient ( 42, "license_key" )) Exceptions Database Set the named host argument to "" to use the GeoLite2 // web service instead of GeoIP2.
#Maxmind db reader license#
// Replace "42" with your account ID and "license_key" with your license // key. If you are making multiple requests, a single WebServiceClient // should be shared across requests to allow connection reuse.
