我有一个处理很长时间的VB6应用程序。直接杀死它是不可行的,所以我想在VB6应用程序中设置某种标志。如果在我的C#应用程序中我决定将其关闭,我想切换此标志以让VB6应用程序知道已请求关闭。现在,我还需要一些命名的东西,因为将有几个VB6应用程序作为activex exes旋转。有谁知道如何实现这样的东西?工作流程如下所示
C#app - 在单独的线程中旋转多个VB6 activex.exes,用某些东西初始化应用程序(以下称为标志)我可以在C#中更改,并调用DoStuff命令,这需要很长时间才能返回。 / p>
VB6 - 获取带有标志的initialize命令。 DoStuff被调用。在DoStuff循环中,它检查标志是否仍然设置。
C# - 通过将标志设置为另一个状态来杀死项目
有什么想法吗?
答案 0 :(得分:8)
这是使用VB6客户端和VB6服务器进行异步后台处理的一个非常标准的方案。 (例如,它位于Dan Appleman的book和Microsoft的VB6 samples。)我认为它也适用于C#客户端。
此方案意味着客户端实际上不需要是多线程的,因为调用线程在“DoStuff”发生时不会阻塞。棘手的部分是确保DoStuff以适当的间隔引发事件 - 太长时间,并且当你想要的时候你不能退出:太短,并且你正在放慢DoStuff的速度。此外,当DoStuff退出时,它必须卸载隐藏的表单。
如果DoStuff确实设法在中止之前完成所有工作,您可以引发一个不同的事件来告诉客户端该工作已完成。
答案 1 :(得分:1)
创建ActiveX对象时,保留存储在应用程序或线程中的引用。 COM将处理跨线程的编组。有了参考资料,您可以调用它上面的方法并将其杀死。如果在线程中保留引用,则需要使用.NET的进程间消息传递机制将其传递给要在ActiveX EXE上设置kill标志的.NET线程。
答案 2 :(得分:0)
我不会在进程边界之间保持引用打开,但是你当然可以缓存进程的Long hAnd并从.Net内部调用kill。