еще один способ, с которым я добился определенного успеха, это использование интерфейсов для достижения функционального разделения. цена такого подхода заключается в том, что некоторые поля «повторяются», поскольку каждый интерфейс требует полного отделения от других полей.
В моем случае у меня было 2 потока, которым необходимо передать набор данных, который потенциально велик и требует минимального сбора мусора, насколько это возможно. Т.е. я хочу только передать информацию об изменении с первого этапа на второй. А затем выполните первый процесс для следующей рабочей единицы.
это было достигнуто за счет использования буферов изменений для передачи изменений от одного интерфейса к следующему.
это позволяет одному потоку работать на одном интерфейсе, вносить все его изменения, а затем публиковать структуру, содержащую изменения, которые другой интерфейс (поток) должен применить до своей работы.
выполняя это, вы получаете двойной буфер ... (поток 1 создает отчет об изменениях, в то время как поток 2 использует последний отчет). Если вы добавляете больше интерфейсов (и потоков), создается впечатление, что в потоках движутся импульсы работы.
Это было основано на моих исследованиях, и я не сомневаюсь, что сейчас есть лучшие методы.
Моя цель, однако, заключалась в том, чтобы избежать необходимости блокировок в подавляющем большинстве кода путем разработки условий гонки. Другим важным фактором является производительность при сборке мусора, которая может не быть проблемой для вас.
этот способ хорош, пока вам не понадобятся сложные взаимодействия между потоками ... затем вы обнаружите, что начинаете заставлять структуру ваших буферных структур для повторного использования, чтобы обойти наследование, которое, в свою очередь, требует дополнительных затрат на обслуживание.