Является ли ConcurrentBag подходящим инструментом для работы здесь?
Это правильный инструмент для работы, это действительно зависит от того, что вы пытаетесь сделать, и почему.Пример, который вы привели, очень упрощен без контекста, поэтому трудно сказать.
Является ли переключение пакетов правильным способом для очистки списка для новых точек данных и последующей обработки старых?
Ответ - нет, возможно, по многим причинам.Что произойдет, если поток записывает в него, пока вы его переключаете?
Безопасно ли работать со oldBag или у меня могут возникнуть проблемы, когда я перебираю oldBag, а поток все еще добавляет элемент?
Нет, вы только что скопировали ссылку, это ничего не даст.
Должен ли я использовать Interlocked.Exchange () для переключения переменных?
Методы блокировки - замечательные вещи, однако это не поможет вам в вашей текущей проблеме, они предназначены для поточно-безопасного доступа к значениям целочисленных типов.Вы действительно сбиты с толку, и вам нужно поискать больше примеров, ориентированных на многопоточность.
Однако, давайте направим вас в правильном направлении.забудьте о ConcurrentBag и тех модных классах.Мой совет: начните с простого и используйте блокировку, чтобы вы понимали природу проблемы.
Если вы хотите, чтобы несколько задач / потоков имели доступ к списку, вы можете легко использовать оператор lock
и защитить доступ к списку./ массив, поэтому другие неприятные потоки не изменяют его.
Очевидно, что написанный вами код является бессмысленным примером, я имею в виду, что вы просто добавляете последовательные числа в список и получаете другой поток для их усреднения.Вряд ли это вообще должен быть потребительский производитель, и имело бы больше смысла просто быть синхронным.
На этом этапе я хотел бы указать вам на лучшие архитектуры, которые позволили бы вам реализовать этот шаблон, например, Tpl Dataflow, но я боюсь, что это всего лишь учебный акциз, и, к сожалению, вам действительно нужно больше читать по многопоточности ипопробуйте больше примеров, прежде чем мы действительно сможем помочь вам с проблемой.