none
PlugIns mit GUI in separaten Threads RRS feed

  • Frage

  • Hi,

    ich habe folgendes Problem:

    Ich habe eine Anwendung, welche eigene PlugIns laden soll. Das ist mit Assembly.LoadFrom() soweit auch kein Problem.

    Jedes PlugIn soll wie eine eigene Anwendung agieren, d.h. sie hat eine Hauptmethode, welche von meiner Anwendung gestartet wird.

    Die PlugIns sollen alle in separaten Threads laufen, damit ein PlugIn nicht die ganze Anwendung und somit andere PlugIns lahmlegen kann.

    Jetzt könnte ich also mit Thread oder mit Task (seit .NET 4.0) einfach die Hauptmethode des PlugIns in einem separaten Thread ausführen lassen.

    So weit kein Problem.

    ABER:

    Ein PlugIn kann auch eine GUI haben. In meinem Fall ein UserControl, welches in meiner Anwendung angezeigt werden soll.

    Dies stellt nun ein Problem dar, da dieses UserControl nicht mehr erzeugt werden kann, da mein PlugIn in einem separaten Thread läuft und das UserControl nur vom GUI-Thread erzeugt werden darf.

    Wenn ich den ApartmentState auf STA stelle, ist auch dieses Problem scheinbar behoben. Aber dann laufen doch alle PlugIns über diesen Thread oder nicht? Außerdem ist es dann nicht möglich, ein PlugIn zweimal zu laden, weil ich sonst eine Exception erhalte, dass das UserControl schon erzeugt wurde. Es ist aber zwingend erforderlich, dass ich ein PlugIn auch mehrfach laden kann und somit mehrfach das zugehörige UserControl anzeigen lassen kann.

    Jedes PlugIn besteht einfach aus einer Klasse, welches von meiner PlugIn-Klasse ableitet. Ich möchte also, dass entweder die ganze Assembly in einem separaten Thread geladen wird oder die Möglichkeit haben, dass ich eine Methode des PlugIns in einem separaten Thread ausführen lassen und diese Methode aber auch GUI-Controls erzeugen kann.

    Oder ist die ganze Überlegung eh hinfällig, weil vielleicht ein Assemby.LoadFrom eh schon die ganze Assembly mit all ihren Objekten, Klassen und UserControls in einem separaten Thread ausführt?

    Viele Grüße
    Sascha
    Dienstag, 1. Juni 2010 14:23

Antworten