Okay, we all know updating a GUI from another thread is not good practice, but now in .Net 2.0 if you try it the Framework throws an exception. So, how do you do it then? Well I'll show you. First off, I use the MVC pattern so this example is a little more complex than it needs to be, but that's just tough luck I'm afraid. :) First thing to do is to create a delegate in your view class to hold a method that will actually do the updating of the view, like so... public delegate void TreeViewUpdateDelegate(string nodeName, string nodeDisplayString); Then create the method that will acutally do the updating of the view, again do this in the view class, like so... public void SetTreeNodeDisplayText(string nodeName, string nodeDisplayString) { foreach (TreeNode tn in _SearchServiceTreeView.Nodes) { if (tn.Name == nodeName) { tn.Text = nodeDisplayString; } } } After that, create a property, in the view class, to hold the delegate as below... private TreeViewUpdateDelegate _UpdateDelegate; public TreeViewUpdateDelegate UpdateDelegate { get { return _UpdateDelegate; } set { _UpdateDelegate = value; } } Next, in your controller class, when you create the instance of the view, set the property as well, like so... _MainView.UpdateDelegate = new MainView.TreeViewUpdateDelegate( _MainView.SetTreeNodeDisplayText); Now, create a delegate to hold the method that will be executed on the thread like this... delegate void SearchWorkerDelegate(); Then, in your controller class, spin off a thread to do some work and designate a callback method to execute when the thread has completed, as below... SearchWorkerDelegate SearchWorker = this.DoGoogleSearchWorker; SearchWorker.BeginInvoke(this.OnGoogleSearchComplete, null); Finally, in the callback method, call the invoke method to update the GUI on the thread on which it was created... string[] stringParams = new string[2]; if (AppModel.Instance.GoogleSearchResult != null) { stringParams[0] = "_GoogleSearchNode"; stringParams[1] = "Google " + "( " + AppModel.Instance.GoogleSearchResult. resultElements.Length.ToString() + " hits)"; _MainView.Invoke(_MainView.UpdateDelegate, stringParams); } else { stringParams[0] = "_GoogleSearchNode"; stringParams[1] = "Google"; _MainView.Invoke(_MainView.UpdateDelegate, stringParams); } You see, that was nice and easy now wasn't it :)