Я хочу парализовать 3D-редактор вокселей, созданный поверх Windows Forms, он использует raycaster для рендеринга, поэтому разделение экрана и получение каждого потока в пуле для его рендеринга должно быть тривиальным.
Проблема возникает в том, что поток Windows Forms должен работать как STA - я могу заставить другие потоки запускаться и выполнять работу, но блокировка основного потока при ожидании их завершения вызывает странные случайные взаимоблокировки, как и ожидалось.
Сохранение основного потока разблокированным также было бы проблемой - если, например, пользователь использует инструмент заливки, входные данные будут обрабатываться во время процесса рендеринга, что приведет к появлению промежуточных изображений (объект частично окрашен, для пример). Копирование всего изображения перед каждым кадром также невозможно, поскольку тома достаточно велики, чтобы компенсировать любой выигрыш в производительности, если его нужно копировать в каждом кадре.
Я хочу знать, есть ли какой-нибудь обходной путь, чтобы заставить амино-поток казаться заблокированным для пользователя таким образом, что он не будет фактически заблокирован, но задержит обработку ввода до следующего кадра.
Если это невозможно, есть ли лучший дизайн для решения этой проблемы?
РЕДАКТИРОВАТЬ: Читая anwsers Я думаю, я не был уверен, что raycaster работает в режиме реального времени, поэтому показ диалогов прогресса не будет работать вообще. К сожалению, FPS достаточно низок (5-40 в зависимости от различных факторов) для ввода между кадрами для получения нежелательных результатов.
Я уже пытался реализовать его, блокируя поток пользовательского интерфейса и используя для обработки некоторые потоки ThreadPool, и он работает нормально, за исключением этой проблемы с STA.