You need to either use BackgroundWorker
, or Control
.Invoke
/BeginInvoke
. Anonymous functions – either anonymous methods (C# 2.0) or lambda expressions (C# 3.0) make this easier than it was before.
In your case, you can change your code to:
public bool AddUser(string user, RichTextBox textBox1, List listBox1)
{
MethodInvoker action = delegate
{ textBox1.Text += "Connected to server... \n"; };
textBox1.BeginInvoke(action);
}
A few things to note:
- To conform with .NET conventions, this should be called
AddUser
- You don’t need to pass the textbox or listbox by reference. I suspect you don’t quite understand what
ref
really means – see my article on parameter passing for more details. - The difference between
Invoke
andBeginInvoke
is thatBeginInvoke
won’t wait for the delegate to be called on the UI thread before it continues – soAddUser
may return before the textbox has actually been updated. If you don’t want that asynchronous behaviour, useInvoke
. - In many samples (including some of mine!) you’ll find people using
Control.InvokeRequired
to see whether they need to callInvoke
/BeginInvoke
. This is actually overkill in most cases – there’s no real harm in callingInvoke
/BeginInvoke
even if you don’t need to, and often the handler will only ever be called from a non-UI thread anyway. Omitting the check makes the code simpler. - You can also use
BackgroundWorker
as I mentioned before; this is particularly suited to progress bars etc, but in this case it’s probably just as easy to keep your current model.
For more information on this and other threading topics, see my threading tutorial or Joe Albahari’s one.