Bry*_*her 3 c# winapi multithreading activex winforms
背景:我和我的同事正在维护我们继承的百万行遗留应用程序.它的前端是用VB6编写的,当我们将几乎所有的资源用于将其转换为C#时,我们正在为我们的特定问题寻找快速而肮脏的解决方案.
应用程序以插件方式运行.最多可以在网格样式的布局中同时加载20个单独的ActiveX控件.问题是ActiveX控件在他们自己的UI线程上完成所有处理,并且由于很多阻止等待网络访问,UI变得非常浓.当我们的托管C#应用程序加载这些控件时,它变得没有响应,因为有多少控件正在咀嚼UI资源什么都不做.最重要的是,控件很脆弱,在最轻微的挑衅时会崩溃.当它们在主C#应用程序中托管时,会造成严重的不稳定性.
到目前为止,我和我最好的同事是根据ActiveX控件启动一个进程.这个过程,我们称之为代理,是另一个winforms应用程序.它使用命名管道与托管进程进行通信.托管过程创建一个窗口,加载我们选择的ActiveX控件(通过一些反射和AxHost魔术),并通过命名管道告诉主过程它的窗口句柄是什么.主进程使用SetParent和SetWindowPos的组合将代理应用程序移动到自身中以模拟插件.通过命名管道发送大小更新.
这很有效,直到ActiveX应用程序执行某种冗长的过程,我们在主窗口工作时点击它.有一段时间,主窗口是响应式的,但最终它会在子窗口等待其UI线程时变得无响应.我们怎样才能让子窗口保持自己的完整线程,同时还能获得SetParent的好处?
(如果有什么不清楚,请告诉我!)
我之前做过这个.它变得凌乱.
我们在自己的AppDomain中运行每个插件,它启动了自己的UI线程.当我们没有使用不同的UI线程时遇到了许多非常讨厌的问题,我们就这样做了.
它确实意味着您可以通过AppDomains进行通信,但这是可行的.主要的是你需要Application.Run在每个AppDomain /插件中运行.通过大量的关注在他们之间进行沟通 - 即使关闭也很棘手.
祝好运 :)