我正在将一个古老的 VB6 程序移植到 C#/.Net。我不太了解VB6,我问这个是为了更好地理解它。
旧的VB6程序有一个程序执行的主过程,但是它also有许多用于套接字事件或计时器事件的事件处理程序,以及这些经常操纵的共享资源(例如,公共全局变量)的处理程序,每当它们醒来并运行时。
尽管如此,旧程序似乎运行正常。
尝试在 C# 中执行相同的体系结构是灾难性的,因为系统在与主应用程序线程不同的线程中调用套接字或计时器的事件处理程序,并导致频繁的异常,例如“调用线程无法访问此对象,因为不同的线程拥有它。”,更不用说更微妙的问题了。我在转换中的大部分工作是重新架构程序以使其线程安全,并消除原始程序对全局变量的大量使用。
我的问题VB6 事件处理程序在单独的线程中运行吗?如果是这样的话,VB6 是如何摆脱这个问题的呢?除此之外,VB6 程序有一个计时器,每 4 秒醒来一次,操作一些全局变量并返回睡眠状态,而主程序则在做它的事情。我不明白为什么这没有导致冲突。
Visual Basic 中的单元模型线程 http://msdn.microsoft.com/en-us/library/aa261361%28v=vs.60%29.aspx
如果您想要了解详细信息,请研究 COM 中的单元线程模型。 VB6 基本上使用 COM 及其内置的隐式线程模型,将单个线程视为消息传递实体。它简化了线程安全性,但实际上将所有方法调用都视为排队的服务调用,从而牺牲了大量开销。
所有代码基本上都在实现 COM 服务调用的容器中运行。如果您曾经使用过用其他语言用 VB6 编写的东西,通常可以通过 COM 与它们交互。
VB6 事件处理程序在单独的线程中运行吗?
不是真的,因为没有单独的线程。您的代码在单个线程上运行,包装在我上面描述的类似服务的架构中。您所谈论的大多数线程对象都是其他具有自己的单元的 COM 对象。因此,为了来回通信,当线程相互通信时,您基本上是在进行 RPC 调用:您并不是直接操作它们。
除此之外,VB6 程序有一个计时器,每 4 秒醒来一次,操作一些全局变量并返回睡眠状态,而主程序则在做它的事情。我不明白为什么这没有导致冲突。
“计时器”位于为计时器创建的单独线程上,但是当它调用您的代码时,可以保证您不会中断任何其他函数,因为函数调用基本上一次在线程中排队。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)