Sry dafür tu ich mich grad bissi schwer mich da genauer reinzudenken (und zeitlich ;-) ).
Hab nur mehr versucht dein Problem zu verstehen.
Aber, ich glaube alles läuft ja über TestComMain was einfach erstmal eine Klasse ist und diese steuert ja auch die Threads.
Eigentlich sollte das ganze dann eher so aufgebaut sein das du nicht über InvokeRequired deines Controls prüfst, sondern entsprechend selber die Klasse TestComMain sich darum kümmert und das Formular im Hauptthread aufruft.
Vorallem dein Formular könnte disposed sein wenn der Nutzer dies einfach schließt, dann müsste InvokeRequired eine DispsoedException schmeißen.
Kannst dir ja mal z.B. AsyncOperation anschauen, deren Post/Send Methoden führen die übergebene Methode in dem Thread aus in dem das AsyncOperation erstellt wurde.
https://docs.microsoft.com/de-de/dotnet/api/system.componentmodel.asyncoperation?view=net-5.0
InvokeRequired verwende ich eher blos, wenn das Formular/Control selbst eigene Thread startet und diese verwaltet.
kleines AsyncOperation Beispiel:
C#:
public void StartAsync()
{
AsyncOperation _ao = AsyncOperationManager.CreateOperation(null);
Task.Factory.StartNew(() => DoAsync(_ao));
}
private void DoAsync(AsyncOperation _ao)
{
//...
//Methode aufruf im Thread wo _ao erstellt wurde
_ao.SynchronizationContext.Send((oo) => {/* was machn */ }, null);
//...
//Methode aufruf im Thread wo _ao erstellt wurde
_ao.Post((oo) => {/* was machn */ }, null);
}