Events automatisch threadsicher mit Invoke

KlausZ_OS

Grünschnabel
Hallo zusammen,
ich habe folgendes Problem:
Ich habe eine Unmanaged DLL in Managed-C++ eingebunden.
Hierbei wird eine Callback-Funktionalität verwendet, wobei die Callbacks von Threads aufgerufen werden, die in der DLL selbst erzugt worden sind.
Hierdurch passiert es, dass quasi "fremde" Threads nun Events des managed C++ aufrufen, die dann ihrerseits auf bekannterweise nicht-thread-sichere Form-Komponenten zugreifen.

Um einen thread-sicheren Zugriff auf die Form-Komponenten zu gewähren, verwende ich nun folgenden Code:

class Form1
{
// Initialisieren der Thread-Klass (die intern DLL mit Threads kapselt),
// sowie Verknüpfung der Events mit "normaler" Methode (d.h. nicht-thread-sicher)
void Init(void)
{
m_pMyClass = gcnew CMyClass();
m_pMyClass->MyEvent += gcnew MyDelegate(this,&Form1::DoOnEvent);
m_pMyClass->StartThreads();
};

// Die nicht-thread-sichere Event-Verknüpfung
// Diese ruft nun mittels Invoke auf thread-sichere Weise die eigentliche
// Methode auf, die dann die Form-Komponenten bearbeiten kann.
void DoOnEvent(CParameters^ Params)
{
this->Invoke(gcnew MyDelegate(this,&Form1::DoOnIvokedEvent),Params);
}

// Methode, die nun thread-sicher auf die Form-Komponenten zugreift
void DoOnIvokedEvent(CParameters^ Params)
{
[ Hier dann der Zugriff auf die Form-Komponenten ]
}
}

Das funktioniert auch soweit sehr gut.

Da ich sehr viele Events habe, brauche ich nach diesem Verfahren aber
jedesmal zwei Methoden zum Verknüpfen der Events:
Eine Methode (hier DoOnEvent), die direkt mit dem Event verknüpft ist und eine weitere Methode, die dann indirekt per Invoke aufgerufen wird und dadurch thread-sicher auf die Form-Komponenten zugreifen kann.
Die ist natürlich recht umständlich und jedesmal mit viel Routine-Arbeit verbunden, da in der einen Methode stets nur der Aufruf einfach mittels Invoke weitergereicht wird.

Das geht doch bestimmt auch intelligenter, oder ?

In der Borland-Umgebung hatte ich mir hierzu eine extra Template-Klasse geschrieben, die dann ebentfalls mit Events verknüpft werden konnte und die notwendige Thread-Synchronisierung dann einfach intern kapselte.
Leider bin ich noch ein .Net-Newbee, dass ich mich hier noch nicht exakt auskenne.

Ich denke aber, auch hier müßte es vielleicht möglich sein, durch eine spezielle, vielleicht von einem Delegate abgeleitete Klasse das interne Invoken direkt zu automatisieren?

Für Hilfe wäre ich sehr dankbar !

Vielen Dank im schon Voraus,
Klaus Z from Osnabrück/Germany
 
Zurück