Concurrency Issue
See original GitHub issueCode USed: Startup.cs
DeviceDetector.SetVersionTruncation(VersionTruncation.VERSION_TRUNCATION_NONE);
var userAgent = context.Request.Headers["User-Agent"];
var deviceDetector = new DeviceDetector(userAgent);
deviceDetector.Parse();
Issue encounter: System.InvalidOperationException: Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection’s state is no longer correct.
at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary`2.ContainsKey(TKey key)
at DeviceDetectorNET.Cache.DictionaryCache.Contains(String id)
at DeviceDetectorNET.Cache.DictionaryCache.Fetch(String id)
at DeviceDetectorNET.Parser.ParserAbstract`2.GetRegexes()
at DeviceDetectorNET.Parser.Client.LibraryParser…ctor()
at DeviceDetectorNET.Parser.Client.ClientType.get_Library()
at DeviceDetectorNET.DeviceDetector.AddClientsParser()
at DeviceDetectorNET.DeviceDetector…ctor(String userAgent)
Issue Analytics
- State:
- Created 3 years ago
- Comments:6
Top GitHub Comments
So I went into the source code to match up with the stack trace for this exception and realized I was using a dotnet core version package of DeviceDetector.NET that I don’t believe exists anymore. Nuget package manager was not notifying me of updating. So I removed it and started using the latest package of DeviceDetector.NET which now supports the latest .net standard. So far, I have not run into this issue.
Sure, there is still the possibility that DeviceDetector will write to it’s internal cache collection on concurrent requests but this seems to have helped me in a high load environment. I wonder if setting a new instance of DictonaryCache on each request in combination with the custom ConcurrentDictionary cache will completely eliminate the error. I will need to review the source code at some point, in the meantime here is some code.
`private static ConcurrentDictionary<string, DeviceInfo> cache = new ConcurrentDictionary<string, DeviceInfo>(); private static DictionaryCache dicationaryCache = new DictionaryCache();