public void UpdateAvailableUsers() { lock (AvailableUsersSyncRoot) { var defaultSectionName = SettingsFile.DefaultSectionName; var userLogins = SettingsFile.GetSections() .Where(userLogin => userLogin != defaultSectionName) .OrderBy( login => login, StringComparer.Ordinal) .ToArray(); var users = new Dictionary <string, User>(userLogins.Length); foreach (var login in userLogins) { try { var token = GetUserToken(login); string rocketPassword = string.Empty; Task.Run(async() => { try { rocketPassword = GetUserRocketPassword(login); if (string.IsNullOrEmpty(rocketPassword)) { var result = await UserApi.GetRocketPassword( token) .ConfigureAwait(false); if (!result.IsError && result.Data != null) { rocketPassword = result.Data.Password; SetUserRocketPassword(login, rocketPassword); } else { rocketPassword = string.Empty; SetUserRocketPassword(login, rocketPassword); } } } catch (CryptographicException) { rocketPassword = string.Empty; SetUserRocketPassword(login, rocketPassword); } catch (FormatException) { rocketPassword = string.Empty; SetUserRocketPassword(login, rocketPassword); } }); users.Add( login, new User( login, token, GetUserId(login), rocketPassword, UserStoreType.Permanent)); } catch (CryptographicException) { RemoveUser(login, false); } catch (FormatException) { RemoveUser(login, false); } } var oldAvailableUsers = AvailableUsers; AvailableUsers = new ReadOnlyDictionary <string, User>(users); AvailableUsersChanged?.Invoke(this, new AvailableUsersChangedEventArgs(oldAvailableUsers, AvailableUsers)); } }