Reputation: 2001
Can anybody tell me how if and else statements are related in this function. I am displaying text from another thread to GUI thread. What's the order or way of execution. Is the else statement necessary?
delegate void SetTextCallback(string text);
private void SetText(string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.textBox7.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox7.Text = text;
}
}
Upvotes: 3
Views: 262
Reputation: 7737
Just to add to the other answers, this is a common pattern (especially in scenarios where the called method contains a fair amount of logic) - calling back into the same method from the UI thread if InvokeRequired
returns true:
private void SetText(string text)
{
if (InvokeRequired)
BeginInvoke(new Action<string>((t) => SetText(text)));
else
textBox7.Text = text;
}
That way you do not have to repeat your logic in both the if
and else
.
Upvotes: 1
Reputation: 11549
Invoke
.this.Invoke
calls SetText with the given parameter again. Also check thiselse
block we are sure text is set thread safelyUpvotes: 4
Reputation: 437376
The else
is definitely necessary.
What this code does is allow you to safely call SetText
from any thread. If you call it from a thread other than the UI thread (if
block) it transparently forwards the call to the UI thread (else
block), which is the only one that can access the control to read or set its text.
Blindly going for this.textBox7.Text
will cause an exception if not done on the UI thread.
Upvotes: 2
Reputation: 14919
InvokeRequired
is used to check whether the statements are executed in the main UI thread or in an other thread than UI thread.
If the statements are being executed in an other thread than UI thread, Invoke
is used to not to cause any CrossThread
exception.
Upvotes: 2