private async Task SyncMailboxesAsync() { Application.Current.AssertBackgroundThread(); lock (_syncChildrenMutex) { if (IsSyncingChildren) { return; } IsSyncingChildren = true; } try { var pattern = string.Format("{0}{1}%", Name, Delimiter); var children = await _account.ListMailboxesAsync(pattern); var subscribed = await _account.ListSubscribedMailboxesAsync(pattern); using (var database = new DatabaseContext()) { foreach (var child in children) { var c = child; var mailbox = await database.Mailboxes.FirstOrDefaultAsync(x => x.Name == c.Fullname); if (mailbox != null) { continue; } var context = new MailboxContext(_account, new MailboxModel { AccountId = _account.Id }); await context.InsertAsync(); await context.BindMailboxAsync(child, subscribed); await Application.Current.Dispatcher .InvokeAsync(() => _account.NotifyMailboxAdded(context)); } } } finally { lock (_syncChildrenMutex) { IsSyncingChildren = false; } } }