Mache meinen COM-Assembly-Aufruf asynchron

Ich habe mir gerade das Privileg "verdient", bei meiner aktuellen Arbeit eine in C # codierte Legacy-Bibliothek zu führen.

Diese DLL:

Enthält Methoden für ein großes Altsystem, das mit Uniface erstellt wurde und keine andere Wahl hat, als COM-Objekte aufzurufen.Dient als Verbindung zwischen diesem Altsystem und der API eines anderen Systems.Verwendet in einigen Fällen WinForm für die Benutzeroberfläche.

Optischer, wie ich die Komponenten verstehe:

*[Big legacy system in Uniface]* == [COM] ==> [C# Library] == [Managed API] ==> *[Big EDM Management System]*

Die Frage ist: Eine der Methoden in dieser C # -Bibliothek dauert zu lange und ich"sollte" mach es asynchron!

Ich bin an C # gewöhnt, aber an COM überhaupt nicht. Ich habe bereits gleichzeitig programmiert, aber COM scheint das Ganze sehr komplex zu machen, und alle meine bisherigen Versuche enden entweder in:

Ein Absturz ohne FehlermeldungMeine Dll funktioniert nur teilweise (sie zeigt nur einen Teil ihrer Benutzeroberfläche an und wird dann geschlossen) und gibt mir immer noch keinen Fehler

Mir fehlen Ideen und Ressourcen zum Umgang mit Threads in einer COM-DLL, und ich würde mich über jeden Hinweis oder jede Hilfe freuen.

Bisher der größte Teil des Codes, den ich geändert habe, um meine Methode asynchron zu machen:

// my public method called by the external system
public int ComparedSearch(string application, out string errMsg) {
  errMsg = "";
  try {
    Action<string> asyncOp = AsyncComparedSearch;
    asyncOp.BeginInvoke(application, null, null);
  } catch (ex) {
    // ...
  }
  return 0;
}

private int AsyncComparedSearch(string application) {
  // my actual method doing the work, that was the called method before
}

Jeder Hinweis oder nützliche Ressource wäre dankbar. Vielen Dank.

UPDATE 1:

Nachfolgend finden Sie Antworten und Hinweise (insbesondere zum ThemaSynchronizationContextund mit Hilfe vondieses Beispiel) Ich konnte meinen Code überarbeiten und zum Laufen bringen, aber nur, wenn er von einer anderen Windows-Anwendung in C # aufgerufen wurde, und nicht über COM. Das Altsystem stößt beim Aufrufen der Funktion auf einen ziemlich undurchsichtigen Fehler und gibt keine Details zum Absturz an.

UPDATE 2:

Letzte Aktualisierungen in meinen Versuchen: Ich habe es geschafft, das Multithreading zum Laufen zu bringen, wenn die Aufrufe von einem Testprojekt stammen, undnicht von demUniface-System. Nach mehreren Versuchen sind wir der Meinung, dass unser Altsystem Multithreading in seiner aktuellen Konfiguration nicht gut unterstützt. Aber darum geht es nicht mehr :)

Hier ist ein Auszug aus dem Code, der zu funktionieren scheint:

string application;
SynchronizationContext context;

// my public method called by the external system
public int ComparedSearch(string application, out string errMsg) {
    this.application = application;
    context = WindowsFormsSynchronizationContext.Current;
    Thread t = new Thread(new ThreadStart(AsyncComparedSearchAndShowDocs));
    t.Start();
    errMsg = "";
    return 0;
}

private void AsyncComparedSearch() {
    // ANY WORK THAT AS NOTHING TO DO WITH UI
    context.Send(new SendOrPostCallback(
        delegate(object state)
        {
            // METHODS THAT MANAGE UI SOMEHOW
        }
    ), null);
}

Wir erwägen jetzt andere Lösungen als das Ändern dieser COM-Assembly, z. B. das Einkapseln dieser Bibliothek in einen Windows-Dienst und das Erstellen einer Schnittstelle zwischen dem System und dem Dienst. Es sollte nachhaltiger sein ..

Antworten auf die Frage(1)

Ihre Antwort auf die Frage