Заполнение словаря C# в асинхронном режиме с помощью условных аргументов перед доступом из потоков, читающих содержимое ⇐ C#
-
Гость
Заполнение словаря C# в асинхронном режиме с помощью условных аргументов перед доступом из потоков, читающих содержимое
Я работаю над приложением async, которое заполняет словарь парами «ключ-значение» данных из одной системы, а затем использует словарь, чтобы определить, есть ли во второй системе совпадающие данные. Проблема в том, что словарь не завершает заполнение своих данных до того, как другие потоки попытаются найти данные в парах ключ-значение, что дает неправильные результаты.
Я попытался преобразовать исходный код, который представляет собой метод void, в асинхронный метод, возвращающий задачу. Что-то, что начинается как
async Task CreateGALEmailTypesDictionary(IEnumerable? interActionClientAllRecords, SearchResultCollection ADClientAllRecords) но поскольку вся логика внутри метода основана на условных операторах и не требует дополнительной асинхронности, я не увидел способа использовать await или Task.WhenAll.< /п> Ниже приведен исходный код для заполнения словаря. Как я могу использовать эту логику в асинхронном приложении и гарантировать, что словарь заполнится до того, как другие процессы прочитают содержащиеся в нем данные?
public void ReviewGALEmailTypesForDeletions(IEnumerable? interActionClientAllRecords, SearchResultCollection ADClientAllRecords) { нить? InterAction_GAL_EmailType = string.Empty; нить? AD_GAL_EmailTypeInInterAction = string.Empty; если (interActionClientAllRecords не равно нулю) { Словарь InterActionGALEmailTypes = новый словарь(); foreach (InterActionQueryResult_BaseClass interActionClientRecord в interActionClientAllRecords) { //Типы электронной почты InterAction GAL могут содержать пробелы, а типы электронной почты AD GAL — нет. Пробелы удалены для последующего сопоставления. если (interActionClientRecord.InterActionEmailType имеет значение null) InterAction_GAL_EmailType = string.Empty; еще InterAction_GAL_EmailType = interActionClientRecord.InterActionEmailType.Replace(" ", string.Empty); если (interActionClientRecord.GALEmailType имеет значение null) interActionClientRecord.GALEmailType = string.Empty; еще AD_GAL_EmailTypeInInterAction = interActionClientRecord.GALEmailType.Replace(" ", string.Empty); если (!InterActionGALEmailTypes.ContainsKey(InterAction_GAL_EmailType)) InterActionGALEmailTypes.Add(InterAction_GAL_EmailType, AD_GAL_EmailTypeInInterAction); } //Ищем ADClientAllRecords в словаре
Я работаю над приложением async, которое заполняет словарь парами «ключ-значение» данных из одной системы, а затем использует словарь, чтобы определить, есть ли во второй системе совпадающие данные. Проблема в том, что словарь не завершает заполнение своих данных до того, как другие потоки попытаются найти данные в парах ключ-значение, что дает неправильные результаты.
Я попытался преобразовать исходный код, который представляет собой метод void, в асинхронный метод, возвращающий задачу. Что-то, что начинается как
async Task CreateGALEmailTypesDictionary(IEnumerable? interActionClientAllRecords, SearchResultCollection ADClientAllRecords) но поскольку вся логика внутри метода основана на условных операторах и не требует дополнительной асинхронности, я не увидел способа использовать await или Task.WhenAll.< /п> Ниже приведен исходный код для заполнения словаря. Как я могу использовать эту логику в асинхронном приложении и гарантировать, что словарь заполнится до того, как другие процессы прочитают содержащиеся в нем данные?
public void ReviewGALEmailTypesForDeletions(IEnumerable? interActionClientAllRecords, SearchResultCollection ADClientAllRecords) { нить? InterAction_GAL_EmailType = string.Empty; нить? AD_GAL_EmailTypeInInterAction = string.Empty; если (interActionClientAllRecords не равно нулю) { Словарь InterActionGALEmailTypes = новый словарь(); foreach (InterActionQueryResult_BaseClass interActionClientRecord в interActionClientAllRecords) { //Типы электронной почты InterAction GAL могут содержать пробелы, а типы электронной почты AD GAL — нет. Пробелы удалены для последующего сопоставления. если (interActionClientRecord.InterActionEmailType имеет значение null) InterAction_GAL_EmailType = string.Empty; еще InterAction_GAL_EmailType = interActionClientRecord.InterActionEmailType.Replace(" ", string.Empty); если (interActionClientRecord.GALEmailType имеет значение null) interActionClientRecord.GALEmailType = string.Empty; еще AD_GAL_EmailTypeInInterAction = interActionClientRecord.GALEmailType.Replace(" ", string.Empty); если (!InterActionGALEmailTypes.ContainsKey(InterAction_GAL_EmailType)) InterActionGALEmailTypes.Add(InterAction_GAL_EmailType, AD_GAL_EmailTypeInInterAction); } //Ищем ADClientAllRecords в словаре
Мобильная версия