我运行一个多线程的Windows服务,需要调用的dll VB6。有没有这方面的VB6的dll文件和这个遗留系统支持非常关键的业务流程。

目前第一时间(第一线程),此dll表现良好。作为其它的线程需要访问,它开始提供错误的结果。

我读一个人说:

  如果你正在使用VB6

“只是要小心的一两件事。你穿线   模型将不得不如果你要改变以支持公寓   运行一个多线程的服务。 VB只支持多   单线程公寓,但.NET运行完全自由线程   一般。在调用该DLL VB6的线程需要被   与DLL兼容“。

这是球队另一个家伙给我的主意,把这个DDL在单独的应用程序域。但我不知道。

我们怎样才能从一个多线程的C#Windows服务应用程序调用的DLL VB6工作?

有帮助吗?

解决方案

当线程进来,你保存对象,后来新语丝重用呢?如果可以,打造清新的每个线程的对象。我们有我们使用一个数据层DLL这样的情况。如果你创建一个线程的连接,它不能从其他使用。如果你创建的每个线程上一个新的连接,它工作正常。

如果它的速度慢于创建对象,看看线程池类和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();
}

其他提示

您说

  

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

,并在同一时间,你说

  

目前第一时间(1º线程),这个dll   表现良好。至于其他线程需要   访问,它开始提供错误   结果

我会做出非常肯定的是,管理层认识你看到的,因为支持关键业务流程的代码是旧的,无证的失败,并且在某种程度上,它从未打算使用正在被使用,并且是从来没有测试使用。我敢打赌,它也从未测试从.NET之前使用的,有吗?

下面是我的建议,这是类似的东西其实我已经实现的:

在VB6 DLL期望在单个线程被调用。 不要辜负了!:当您的服务启动时,有它启动相应类型的线程(我不能说,因为我已经忘记故意所有的STA / MTA的东西)。请求排队到线程访问VB6 DLL。都这样的访问经过单个线程。

这样的话,只要VB6 DLL而言,它的运行正是因为它进行了测试运行。


顺便说一句,这是从我已经实现略有不同。我有一个Web服务,而不是一个Windows服务。我有一个C DLL,不是VB6,并且它不是COM。我只是重构所有访问的东西成一个类,然后把锁语句周围的每个公共方法。

这篇文章在多线程的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,而且需要选择的其他两个选项中的一个。

您可能想看看这个: linky

这是引起我的注意一个片段:

  

VB6 COM对象是STA对象,这意味着它们必须在一个STA线程运行。   你是从两个MTA线程创建的对象的两个实例,但对象本身将在一个单一的运行(COM(OLE)创建)STA   线程,并从两个MTA线程访问将被编组和同步。   所以,你应该做的是,初始化线程为STA,使每个对象对自己的STA线程运行没有编组和你   将被罚款。

     

总之,VB风格COM对象总是STA。现在为了防止公寓编组和线程切换,你需要创建   在STA初始化实例公寓。   还要注意的是,当你设置上主要的[MTAThread]属性,您可以有效地初始化主线程作为MTA,当您创建   STA的情况下从MTA线程COM对象将创建一个单独(非托管)线程和初始化它作为STA(这就是所谓的   默认STA),从MTA线程STA对象的所有呼叫将被封(并招致线程切换),在某些情况下,IDispatch接口调用   由于IP封送处理失败将失败。   因此,建议是使用STA(因此VB6)从兼容公寓对象仅

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top