Чтобы изучить встроенный интерфейс C#, я работал над оболочкой OpenGL. Сам API OpenGL - это конечный автомат, привязанный к определенному потоку. Когда объект, содержащий собственные ресурсы, собирает мусор, финализатор работает в потоке GC и не может напрямую освобождать ресурсы.Сбор мусора в C#; удаление объектов в конкретном потоке
Обходной путь, который я имею в настоящее время, состоит в том, чтобы иметь список в объекте context, который объекты добавляют свои ресурсы в безопасную точку цикла нитки, итерации и освобождает их.
Проблема заключается в том, что если GC собирает, когда он выполняет итерацию через этот список, foreach терпит неудачу, поскольку коллекция была изменена. Я не могу просто помещать мьютекс в список, так как GC является stop-the-world в большинстве реализаций, и если цикл рисования заблокировал его, он никогда не завершит итерацию и не разблокирует ее снова.
Обычно MTBF составляет около двух часов геймплея, но если намеренно испытывать стресс с несколькими тысячами объектов в секунду, это происходит всего за несколько секунд.
Какой может быть лучший подход здесь?
Вы используете шаблон размещения в контейнере, чтобы освободить ресурсы в потоке до окончания потока? –
Вы пытались [отключить параллельный GC] (http://msdn.microsoft.com/en-us/library/at1stbec.aspx)? Не совсем уверен, относится ли это, но может стоить проверить. –
Я не могу не думать, что лучшим вариантом здесь будет использование 'use' /' Dispose() ', а не финализатор, чтобы освободить эти ресурсы. –