diff --git a/src/Core/Services/LiteDbStorageService.cs b/src/Core/Services/LiteDbStorageService.cs index e0ee56c6e..2278636b6 100644 --- a/src/Core/Services/LiteDbStorageService.cs +++ b/src/Core/Services/LiteDbStorageService.cs @@ -15,45 +15,63 @@ namespace Bit.Core.Services }; private readonly string _dbPath; private LiteCollection _collection; + private Task _initTask; public LiteDbStorageService(string dbPath) { _dbPath = dbPath; } - public void Init() + public Task InitAsync() { - if(_collection == null) + if(_collection != null) { - var db = new LiteDatabase($"Filename={_dbPath};"); - _collection = db.GetCollection("json_items"); + return Task.FromResult(0); } + if(_initTask != null) + { + return _initTask; + } + Task doTask() + { + + try + { + var db = new LiteDatabase($"Filename={_dbPath};"); + _collection = db.GetCollection("json_items"); + return Task.FromResult(0); + } + finally + { + _initTask = null; + } + }; + _initTask = doTask(); + return _initTask; } - public Task GetAsync(string key) + public async Task GetAsync(string key) { - Init(); + await InitAsync(); var item = _collection.Find(i => i.Id == key).FirstOrDefault(); if(item == null) { - return Task.FromResult(default(T)); + return default(T); } - return Task.FromResult(JsonConvert.DeserializeObject(item.Value, _jsonSettings)); + return JsonConvert.DeserializeObject(item.Value, _jsonSettings); } - public Task SaveAsync(string key, T obj) + public async Task SaveAsync(string key, T obj) { - Init(); + await InitAsync(); var data = JsonConvert.SerializeObject(obj, _jsonSettings); _collection.Upsert(new JsonItem(key, data)); - return Task.FromResult(0); } - public Task RemoveAsync(string key) + public async Task RemoveAsync(string key) { - Init(); + await InitAsync(); _collection.Delete(i => i.Id == key); - return Task.FromResult(0); } private class JsonItem