我正在运行一个需要调用VB6 dll的多线程窗口服务。没有关于这个VB6 dll的文档,这个遗留系统支持非常关键的业务流程。
第一次(第一个线程),这个dll执行得很好。由于其他线程需要访问,它开始提供错误的结果。
我读到一个人说:
“如果使用VB6,请注意一件事。如果您运行多线程服务,您的线程模型将不得不更改为支持公寓。VB只支持多个单线程公寓,但.NET正常运行完全免费的线程。调用VB6 DLL的线程需要与DLL兼容。”
另一个团队的人给了我一个想法,把这个ddl放在一个独立的应用程序域中。但我不确定。
如何使用从多线程VB6 windows服务应用程序调用的c# dll?
发布于 2009-07-03 21:55:14
当线程进来时,您是在保存对象并在新线程上重用它们吗?如果可以,为每个线程创建新的对象。对于我们使用的数据层dll,我们遇到了这样的情况。如果在一个线程上创建连接,则不能从另一个线程使用它。如果您在每个线程上创建了一个新连接,它就可以正常工作。
如果创建对象的速度很慢,请查看ThreadPool类和ThreadStatic属性。线程池一次又一次地循环同一组线程来完成工作,ThreadStatic允许您创建一个仅针对一个线程的对象。例如
[ThreadStatic]
public static LegacyComObject myObject;当请求传入时,将其转换为作业并在线程池中对其进行排队。当作业开始时,检查静态对象是否初始化;
void DoWork()
{
if (myObject == null)
{
// slow intialisation process
myObject = New ...
}
// now do the work against myObject
myObject.DoGreatStuff();
}发布于 2009-07-04 01:57:16
你说
我正在运行一个需要调用VB6 dll的多线程窗口服务。没有关于这个VB6 dll的文档,这个遗留系统支持非常关键的业务流程。
同时你说
在第一次(1线程),这个dll表现良好。由于其他线程需要访问,它开始提供错误的结果。
我要非常肯定的是,Management意识到了您所看到的失败,因为支持关键业务流程的代码是旧的、无文档的,并且是以一种从未打算被使用的方式使用的,并且从未被测试用于使用。我打赌它以前也从未被.NET测试过,是吗?
下面是我的建议,这与我实际实现的类似:
VB6 DLL预期将在单个线程上调用。不要让它失望!当您的服务启动时,让它启动一个合适类型的线程(我不能说,因为我故意忘记了STA/MTA的所有内容)。将请求排队到该线程以访问VB6 DLL。让所有这样的访问通过单线程。
这样,对于VB6 DLL来说,它的运行与测试运行的完全一样。
顺便说一句,这与我所实现的略有不同。我有一个web服务,而不是一个Windows服务。我有一个C DLL,不是VB6,也不是COM。我只是将对事物的所有访问重构到一个类中,然后在每个公共方法周围放置锁语句。
发布于 2009-07-03 20:52:56
本文介绍了Visual Basic 6 DLL的多线程处理提供了一些见解。上面写着:
若要使ActiveX DLL项目多线程,请在“项目属性”对话框的“常规”选项卡上选择所需的线程选项。
这篇文章说有三种可能的模式可供选择:
One thread of execution
Thread pool with round-robin thread assignment
Every externally created object is on its own thread 我假设缺省值是one thread of execution,另外两个选项中的一个需要被选择。
https://stackoverflow.com/questions/1080759
复制相似问题