c# - 为表单的嵌套控件创建多个消息循环

标签 c# winforms multithreading

长话短说,我需要在单独的线程中放置一个 WinForms 面板和一个在其上绘制的非托管类的实例,以保持主窗口响应(SDK 有时可能需要几秒钟才能完成)它将绘制什么,并且在执行此操作时会阻塞 UI 线程)。实际上我需要很多(最多 32 个),但我们现在只讨论一个;这个概念应该能够根据需要重复多次。

我想我需要做的是启动一个新的线程,它将“新建”一个面板,然后启动一个没有特别绑定(bind)到任何东西的 ApplicationContext,并将它分配给面板。然后,Panel 类应该有一个 Dispose() 重载,它将结束 ApplicationContext,关闭消息泵并终止线程。

我需要知道的是:

  • Panel 能否放置在 IContainer 中,或添加到任何父对象的 Controls 集合中?或者,这样做会导致进行非线程安全调用吗?
  • 我在类上有一个静态工厂方法,可以在新线程上创建新实例。我需要从该方法返回对该面板(在后台线程中创建)的引用,以便我可以使用它。有没有比在 while/sleep 循环中等待静态方法中本地定义的变量由后台线程设置更好的方法?
  • 我是否需要保留对拥有面板的线程的引用?
  • 尝试这个我是不是疯了?

最佳答案

您不应该以这种方式处理问题。您应该让绘图线程绘制内存中的图像,并让 UI 线程将这些图像渲染到面板。如果绘图线程为每次迭代生成新图像,则 UI 线程可以缓存该图像并在每次有新图像可用时替换它。以后你会省去很多麻烦,而不是试图篡夺预期的线程行为。

关于c# - 为表单的嵌套控件创建多个消息循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9575666/

相关文章:

c - 多线程程序中不接收UDP并输出数据

静态资源的C++线程安全

c# - 扩展方法如何连接

c# - 定时间隔开始/停止在UDP端口上接收数据

c# - DataGridView CellPainting 绘图文本与符号显示奇怪

c# - 游戏开发 - 避免闪烁

c# - Visual C# 2010 Express : Opening a design and designer tab for a new form in the application

c++ - 使用 "regular"变量同步线程

c# - 如何确保只创建该类对象的一个​​实例?

c# - Chip8 仿真器 - 用户输入