首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多线程VB6 windows服务应用程序调用c# DLL?

从多线程VB6 windows服务应用程序调用c# DLL?
EN

Stack Overflow用户
提问于 2009-07-03 20:40:35
回答 4查看 4.6K关注 0票数 8

我正在运行一个需要调用VB6 dll的多线程窗口服务。没有关于这个VB6 dll的文档,这个遗留系统支持非常关键的业务流程。

第一次(第一个线程),这个dll执行得很好。由于其他线程需要访问,它开始提供错误的结果。

我读到一个人说:

“如果使用VB6,请注意一件事。如果您运行多线程服务,您的线程模型将不得不更改为支持公寓。VB只支持多个单线程公寓,但.NET正常运行完全免费的线程。调用VB6 DLL的线程需要与DLL兼容。”

另一个团队的人给了我一个想法,把这个ddl放在一个独立的应用程序域中。但我不确定。

如何使用从多线程VB6 windows服务应用程序调用的c# dll?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-03 21:55:14

当线程进来时,您是在保存对象并在新线程上重用它们吗?如果可以,为每个线程创建新的对象。对于我们使用的数据层dll,我们遇到了这样的情况。如果在一个线程上创建连接,则不能从另一个线程使用它。如果您在每个线程上创建了一个新连接,它就可以正常工作。

如果创建对象的速度很慢,请查看ThreadPool类和ThreadStatic属性。线程池一次又一次地循环同一组线程来完成工作,ThreadStatic允许您创建一个仅针对一个线程的对象。例如

代码语言:javascript
复制
[ThreadStatic]
public static LegacyComObject myObject;

当请求传入时,将其转换为作业并在线程池中对其进行排队。当作业开始时,检查静态对象是否初始化;

代码语言:javascript
复制
void DoWork()
{ 
    if (myObject == null)
    { 
        // slow intialisation process
        myObject = New ...
    }

    // now do the work against myObject
    myObject.DoGreatStuff();
}
票数 2
EN

Stack Overflow用户

发布于 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。我只是将对事物的所有访问重构到一个类中,然后在每个公共方法周围放置锁语句。

票数 1
EN

Stack Overflow用户

发布于 2009-07-03 20:52:56

本文介绍了Visual Basic 6 DLL的多线程处理提供了一些见解。上面写着:

若要使ActiveX DLL项目多线程,请在“项目属性”对话框的“常规”选项卡上选择所需的线程选项。

这篇文章说有三种可能的模式可供选择:

代码语言:javascript
复制
One thread of execution 
Thread pool with round-robin thread assignment 
Every externally created object is on its own thread 

我假设缺省值是one thread of execution,另外两个选项中的一个需要被选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1080759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档