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

Edu*_*ier 8 c# vb6 legacy integration .net-2.0

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

在第一次(1º线程),这个DLL表现良好.由于其他线程需要访问,它开始提供错误的结果.

我看了一个人说:

"如果你使用的是VB6,请注意一件事.如果你运行的是多线程服务,你的线程模型将不得不改变以支持公寓.VB只支持多个单线程公寓,但.NET通常完全免费运行调用VB6 DLL的线程需要与DLL兼容."

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

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

Ste*_*per 2

当线程进入时,您是否保存对象并稍后在新线程上重用它们?如果可以的话,为每个线程创建新鲜的对象。我们使用的数据层 dll 就遇到过这样的情况。如果您在一个线程上创建连接,则无法从另一个线程使用该连接。如果您在每个线程上创建一个新连接,它就可以正常工作。

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

[ThreadStatic]
public static LegacyComObject myObject;
Run Code Online (Sandbox Code Playgroud)

当请求进来时,将其转换为作业并将其放入线程池中。作业启动时,检查静态对象是否初始化;

void DoWork()
{ 
    if (myObject == null)
    { 
        // slow intialisation process
        myObject = New ...
    }

    // now do the work against myObject
    myObject.DoGreatStuff();
}
Run Code Online (Sandbox Code Playgroud)