in Form1: public Form1() { InitializeComponent(); _myMain = new Main(this); _myMain.myServer.LogEvent += new EventHandler(Form1_LogEvent); } //Handle log events private void Form1_LogEvent(object sender, LogEventArgs e) { //Make sure we're invoking on the right thread if (InvokeRequired) { //Invoke the other-thread method on the Form thread Invoke(new EventHandler(Form1_LogEvent)); } updateLog(e.EntryString); } in Server: //Threading and Event public event EventHandler LogEvent; Thread myServerThread; private void OnLogEvent(string entryString) { EventHandler myHandler = LogEvent; if (myHandler != null) { //Throw the event myHandler(this, entryString); } } in LogEventArgs: private readonly string _entryString; public LogEventArgs(string entryString) { _entryString = entryString; } public string EntryString { get { return _entryString; } }