Очень короткая история, мне нужно поместить панель WinForms и экземпляр неуправляемого класса, который рисует на нем, в отдельном потоке, чтобы поддерживать отзывчивость главного окна (иногда SDK может потребоваться несколько секунд, чтобы придумать что он будет рисовать, и пока он это делает, он блокирует поток пользовательского интерфейса). Я действительно нуждаюсь во многих из них (до 32), но пока мы поговорим только об одном; концепция должна дублироваться столько раз, сколько необходимо.
Я думаю, что мне нужно сделать, это запустить новый поток, который «обновит» Panel, затем запустить ApplicationContext, который не привязан ни к чему конкретному, и назначить его Panel. Затем класс Panel должен иметь перегрузку Dispose (), которая приведет к завершению ApplicationContext, отключив рассылку сообщений и завершив поток.
Что мне нужно знать, это:
- Может ли Panel быть помещена в IContainer или добавлена в коллекцию Controls любого родительского объекта? Или это приведет к выполнению не поточно-безопасных вызовов?
- У меня есть статический метод фабрики в классе, который создает новые экземпляры в новых потоках. Мне нужно вернуть ссылку на эту панель (созданную в фоновом потоке) из метода, чтобы я мог работать с ним. Есть ли лучший способ сделать это, чем ждать в цикле while / sleep, чтобы переменная, определенная локально в статическом методе, была установлена фоновым потоком?
- Нужно ли сохранять ссылку на тему, которой принадлежит Panel?
- Я безумен, пытаясь это сделать?