If I have understood the question correctly

I would declare an event in your thread and then subscribe to the event from your main form.
Depending on what you want to whether you need your own event args class you could do something like


Code:
//Thread event
public static event EventHandler yourEventName;
subscribe to the event on your main form
Code:
classname.yourEventName += mainform_yourEventName;
after you have that done you should be able to use the following class to invoke the event across threads.

Code:
public static class Invoker
    {
        public static void Invoke(Delegate delegateToCall, params object[] argsOfDelegateToCall)
        {
            foreach (Delegate del in delegateToCall.GetInvocationList())
            {
                ISynchronizeInvoke si = del.Target as ISynchronizeInvoke;
                if (si != null && si.InvokeRequired)
                    si.Invoke(del, argsOfDelegateToCall);
                else
                    del.DynamicInvoke(argsOfDelegateToCall);
            }
        }
    }
Invoke the event

Code:
invoker.invoke(myHandler, this, eventargs.empty);
Hopefully that helps

-zd