public async Task StartExecution(MazeTask mazeTask, TaskSession taskSession, TaskExecution taskExecution) { using (await _readerWriterLock.WriterLockAsync()) { var file = _fileSystem.FileInfo.FromFileName(GetTaskDbFilename(mazeTask)); file.Directory.Create(); var transmitterQueue = new TaskQueue(); try { using (var dbStream = file.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite)) using (var db = new LiteDatabase(dbStream)) { var sessions = db.GetCollection <TaskSession>(nameof(TaskSession)); sessions.EnsureIndex(x => x.TaskSessionId, unique: true); var taskSessionEntity = sessions.FindById(taskSession.TaskSessionId); if (taskSessionEntity == null) { taskSessionEntity = new TaskSession { TaskSessionId = taskSession.TaskSessionId, TaskReferenceId = mazeTask.Id, Description = taskSession.Description, CreatedOn = DateTimeOffset.UtcNow }; sessions.Insert(taskSessionEntity); transmitterQueue.Enqueue(() => _requestTransmitter.Transmit(TaskSessionsResource.CreateSessionRequest(taskSessionEntity))).Forget(); } taskExecution.TaskSessionId = taskSessionEntity.TaskSessionId; var executions = db.GetCollection <TaskExecution>(nameof(TaskExecution)); taskExecution.TaskExecutionId = executions.Insert(taskExecution); transmitterQueue.Enqueue(() => _requestTransmitter.Transmit(TaskExecutionsResource.CreateExecutionRequest(taskExecution))).Forget(); } } finally { await transmitterQueue.DisposeAsync(); } } }