2017-11-13 15 views
4

Ich habe Probleme mit dem Ausführen einer Funktion von einer ActiveX-DLL (kompiliert von VB6) in einem Hintergrund-Thread von einer C# WinForms-Anwendung.ActiveX-DLL verstopft Haupt-UI-Thread

Da das VB6-DLL-Projekt viele Verweise auf eine alte Bibliothek namens Sheridan Controls (threed32.ocx) enthält, die hilfreicherweise darauf hingewiesen wird, "unterstützt keinen Multi-Thread-Modus", muss ich das Threading-Modell festlegen Option zu Single Threaded (statt Apartment Threaded) beim Kompilieren der DLL in VB6. Obwohl ich die ApartmentState-Eigenschaft für das C# -Thread-Objekt, von dem ich die DLL aufruft, auf STA festlege, wird der UI-Thread dadurch immer noch blockiert.

Ich bin mir nicht sicher, was meine Optionen zu diesem Zeitpunkt sind. Das Umgestalten der Sheridan Controls aus der DLL wäre eine mühsame Aufgabe. Ein anderes ist nur, Niederlage zu akzeptieren und die Benutzeroberfläche hängen zu lassen, während die DLL ihre Arbeit macht.

Ich denke, meine Hauptfrage ist; Kennt jemand eine Art und Weise, in der ich (ohne großen Aufwand) die Single-Thread-ActiveX-DLL in einem separaten Prozess/Dienst ausführen könnte, der asynchron vom Haupt-C# -Thread aufgerufen werden könnte? Oder gibt es eine andere Option, die mir nicht bekannt ist?

Gelöst: Basierend auf den Informationen von Benutzer @mnistic, konnte ich eine Lösung finden. Ich musste die ActiveX-DLL als eine ActiveX-EXE neu erstellen, die als eine prozessexterne Komponente ausgeführt wird. Um es zum Laufen zu bringen, musste ich "Start Mode" auf "Standalone" in den Projekteigenschaften setzen. Außerdem habe ich den Instancing-Parameter in der VB6-Klasse auf SingleUse gesetzt, um sicherzustellen, dass der globale Status nicht für alle Instanzen freigegeben wird.

Nach dem Aktualisieren des Projektverweises konnte ich die Funktionen in der Bibliothek in Hintergrundthreads von meiner C# -Anwendung aufrufen, ohne GUI-Verzögerung zu verursachen.

+0

Was ist das für eine ActiveX-DLL? Ist es ein Steuerelement, das Sie in Ihre GUI einbetten möchten? – mnistic

+0

Was bedeutet * "Verstopfung" *? – Sinatr

+2

Wenn Sie bis zu keinen Rückgabewert, oder einfachen Typ Rückgabewert, können Sie ActiveX in Kommandozeilen-Exe umbrechen, dann einfach 'Shell' Ihre Exe mit CreateProcess set usynchroniuos = yes .. –

Antwort

3

Wenn es um ActiveX geht, unterscheidet Microsoft zwischen In-Process- und Out-of-Process-Komponenten. Wenn Leute über ActiveX sprechen, beziehen sie sich manchmal auf prozessinterne Komponenten, DLL- oder OCX-Dateien, die im selben Prozess wie der Client ausgeführt werden, der sie verwendet. In der Regel enthalten diese Komponenten GUI-Elemente, die VB6 leicht in die Clientanwendung einbetten kann. Eine In-Process-Komponente muss jedoch den Ausführungsthread des Clients verwenden, der in Ihrem Fall die wahrgenommene Sperrung im Hauptthread verursacht hat.

Dafür sind Out-of-Process-Komponenten zuständig. Sie werden in einem separaten Thread ausgeführt - in der Tat ein separater Prozess. Der Nachteil ist, dass die Kommunikation Prozessgrenzen überschreiten muss, aber in Ihrem Fall ist dies kein Problem, und sie sind relativ einfach einzurichten: https://msdn.microsoft.com/en-us/library/aa262334%28v=vs.60%29.aspx

Verwandte Themen