长话短说,我需要在单独的线程中放置一个 WinForms 面板和一个在其上绘制的非托管类的实例,以保持主窗口响应(SDK 有时可能需要几秒钟才能完成)它将绘制什么,并且在执行此操作时会阻塞 UI 线程)。实际上我需要很多(最多 32 个),但我们现在只讨论一个;这个概念应该能够根据需要重复多次。
我想我需要做的是启动一个新的线程,它将“新建”一个面板,然后启动一个没有特别绑定(bind)到任何东西的 ApplicationContext,并将它分配给面板。然后,Panel 类应该有一个 Dispose() 重载,它将结束 ApplicationContext,关闭消息泵并终止线程。
我需要知道的是:
- Panel 能否放置在 IContainer 中,或添加到任何父对象的 Controls 集合中?或者,这样做会导致进行非线程安全调用吗?
- 我在类上有一个静态工厂方法,可以在新线程上创建新实例。我需要从该方法返回对该面板(在后台线程中创建)的引用,以便我可以使用它。有没有比在 while/sleep 循环中等待静态方法中本地定义的变量由后台线程设置更好的方法?
- 我是否需要保留对拥有面板的线程的引用?
- 尝试这个我是不是疯了?
最佳答案
您不应该以这种方式处理问题。您应该让绘图线程绘制内存中的图像,并让 UI 线程将这些图像渲染到面板。如果绘图线程为每次迭代生成新图像,则 UI 线程可以缓存该图像并在每次有新图像可用时替换它。以后你会省去很多麻烦,而不是试图篡夺预期的线程行为。
关于c# - 为表单的嵌套控件创建多个消息循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9575666/