As you know, creating a Thread in the UI using System.Threading object (or any other thread object that is not UI related) does not allow that thread to access directly the UI objects (Eg: accessing a label “Text” property is not allowed).
The well know work around is to “Invoke the action in the UI” via delegate :
if (ctrl.InvokeRequired) { ctrl.Invoke(....); }
Another workaround is to use extension methods to add an “easy” way to invoke the UI logic.
using System; using System.Windows.Forms; public static partial class Extensions { public static void InvokeIfRequired(this Control c, Action<Control> action) { if (c.InvokeRequired) c.Invoke(new Action(() => action(c))); else action(c); } }
and then with
Label label1 = new Label();
call this method this way from the thread:
label1.InvokeIfRequired(c => { label1.Text = "Label updated via Threading object"; } );
See also :
– Extension Methods @ MSDN
– Control.InvokeRequired Property @ MSDN