В настоящее время у нас есть клиентское приложение, которое состоит из службы Windows и приложения WPF, использующих LiteDB и таргетинг. Net Framework 4.8.
Служба windows работает в локальной системе учетная запись и приложение WPF запускается под учетной записью пользователя.
Мы сделали выбор в пользу обновления с 4.1.4 до 5.0.7 в надежде, что параллелизм лучше поддерживается.
И приложение WPF, и Сервис win получает доступ к той же LiteDB (чтение и запись) с подключением = общий доступ, используя следующую строку подключения:
"Filename=C:\temp\Test-v5.db;password=pass1234;connection=shared"
using (var db = new LiteDatabase(@"Filename=C:\temp\Test-v5.db;password=pass1234;connection=shared"))
{
...
}
Однако, похоже, мы столкнулись с серьезной проблемой и Кажется, я не могу найти никого, кто имеет такую же / похожую проблему или что-то еще, что могло бы ее исправить.
Служба часто опрашивает базу данных, чтобы обработать и обработать данные, которые были вставлены приложением WPF, с чтением обоих и операции записи. Приложение WPF также выполняет чтение и запись в базу данных, но в более короткие промежутки времени c, основанные на взаимодействии с пользователем.
Несмотря на то, что оба приложения обращаются к базе данных одним и тем же способом, и оба указывают на соединение = shared, мы получение исключений от обоих, поскольку они кажутся конфликтующими.
"System.IO.IOException: The process cannot access the file 'C:\temp\Test-v5.db' because it is being used by another process.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
at LiteDB.Engine.FileStreamFactory.GetStream(Boolean canWrite, Boolean sequencial)
at LiteDB.Engine.StreamPool.<>c__DisplayClass3_0.<.ctor>b__0()
at System.Lazy`1.CreateValue()
at System.Lazy`1.LazyInitValue()
at System.Lazy`1.get_Value()
at LiteDB.Engine.DiskService..ctor(EngineSettings settings, Int32[] memorySegmentSizes)
at LiteDB.Engine.LiteEngine..ctor(EngineSettings settings)
at LiteDB.SharedEngine.OpenDatabase()
at LiteDB.SharedEngine.Query(String collection, Query query)
at LiteDB.LiteQueryable`1.<ToDocuments>d__26.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Pixel_Upload_Service.UploadService.GetPendingJobsFromLiteDB(Boolean _allJobs) in D:\Users\Daniel\Desktop\LiteDB v5 Test\Upload Service\UploadService.cs:line 2654"
В качестве дополнительного примечания при тестировании этой проблемы и попытке выяснить, что происходит, мы обнаружили, что не получили никаких исключений с двумя WPF приложения читают и пишут из одной и той же базы данных, однако, как только мы поменяем одно приложение WPF на сервис Windows, мы начнем получать исключения.
Кто-нибудь знает, как мы можем остановить это?