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

Kei*_*thS 3 c# multithreading winforms

很长一段时间,我需要放置一个WinForms面板和一个非托管类的实例,它在一个单独的线程中使用它来保持主窗口的响应(SDK有时需要几秒钟才能得到它的意思绘制,当它这样做时,它会阻止UI线程).我实际上需要很多这些(最多32个),但我们现在只讨论一个; 该概念应该能够在必要时多次复制.

我认为我需要做的是启动一个新的线程,它将"新建"一个Panel,然后启动一个与特定内容无关的ApplicationContext,并将其分配给Panel.然后,Panel类应该有一个Dispose()重载,它将结束ApplicationContext,关闭消息泵并终止线程.

我需要知道的是:

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

Chr*_*ain 6

你不应该这样解决问题.您应该让绘图线程绘制到内存中的图像,并让UI线程将这些图像渲染到面板.如果绘图线程为每次迭代生成一个新图像,那么UI线程可以缓存图像并在每次新图像可用时替换它.稍后你会为自己省去很多麻烦,而不是试图篡夺预期的线程行为.

  • +1:这称为"屏幕外合成".它被大多数应用程序使用,需要一段时间来加载图像,同时需要保持UI响应和无闪烁.这包括从游戏引擎到浏览器的所有内容. (3认同)