@DS2107

Как заполнить список в отдельном потоке?

После того как я получаю список с сервера, у меня этот список может быть в количестве от 0 до 15 элементов - не больше. Я создаю поток, в котором добавляю элементы в локальную базу и в локальный список. Проблема заключается в том , что когда я прохожусь циклом foreach по элементам, которые пришли с сервера, программа выбивает ошибку, что я выхожу за пределы списка, но при этом база и локальный список заполняется, в Try Catch ничего не попадает.
Метод в котором я запускаю поток.
private void Start_Upload_Server(string ValueJobject)
        {
            try
            {
                // Загружаю сообщения с сервера 
                var TempList = JsonConvert.DeserializeObject<ObservableCollection<ChatModel>>(ValueJobject);
                Thread_UploadServer = new Thread(new ParameterizedThreadStart(GetLastMessage_onServer));
                Thread_UploadServer.Start(TempList);
            }
            catch(Exception ex)
            {
                var s = ex;
            }
            
           
        } // Start_Upload_Server


Метод в котором я обрабатываю данные

private async void GetLastMessage_onServer(object obj)
        {
            // Список с сервреа тут 15 элементов 
            var TempList = (ObservableCollection<ChatModel>)obj;
            try
            {
                // Бегу по списку 
                foreach (var item in TempList)
                {
                  
                    // Уточняем явялется ли сообщение шифрованным
                    var flag_Line_Correct = GetLineCorrect(item.Message);
                    if (flag_Line_Correct)
                        item.Message = Decript(item.Message);

                    // устанавливаю нужные мне параметры 
                    SetStartParametr_Message(item);

                    // Добавляю в локальную бд
                    await ChatDbService.AddMessage(item);

                    // Добавляю в локальный список 
                    MessageList.Add(item);
                }
            }
            catch(Exception ex)
            {
                var exception = ex.Message;
            }
            finally
            {

                Thread_UploadServer.Abort();
                Thread_UploadServer.Join();

            }
        } // GetAllMessage

Даже если внутри foreach не будет кода, и программа в пустую пробежится по списку она серавно выйдет за пределы списка. Вот моя ошибка
System.ArgumentOutOfRangeException: 'Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index'
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Kamigakuro
Я конечно не эксперт, но может быть проблему решит вызов Templist.toArray() в foreach? Тем самым будет сделана копия этого списка перед началом перебора и тогда всё будет хорошо... Возможно, конечно, я и не прав, или моё предложение не самое лучшее.)
Получится так:
foreach (var item in TempList.ToArray())
Ответ написан
@DS2107 Автор вопроса
Вероятней всего , поток не является безопасным или не верно запускается , вместо запуска отдельного потока я использовал операторы async/await создав асинхронные операции , таким образом асинхронная операция была выполнена в основном потоке и у меня удалось отдельно от загрузки страницы загрузить данные
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы