Why SynchronizationContext is so important? C# with Example
Consider this example: private void button1_Click(object sender, EventArgs e) { label1.Text = RunTooLong(); } This method will freeze UI application until the RunTooLong will be completed. The application will be unresponsive. You can try run inner code asynchronously: private void button1_Click(object sender, EventArgs e) { Task.Run(() => label1.Text = RunTooLong()); } But this code won't execute because inner body may be run on non-UI thread and it shouldn't change UI properties directly: private void button1_Click(object sender, EventArgs e) { Task.Run(() => { var label1Text = RunTooLong(); if (label1.InvokeRequired) lable1.BeginInvoke((Action) delegate() { label1.Text = label1Text; }); else label1.Text = label1Text; }); } Now don't forget always to use this pattern. Or, try SynchronizationContext.Post that will make it for you: private void button1_Click(object sender, EventArgs e) { Task.Run(() => { var label1Text = RunTooLong(); SynchronizationContext.Current.Post((obj) => { label1.Text = label1 Text); }, null); }); }