Why SynchronizationContext is so important
suggest changeConsider 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);
    });
}
  Found a mistake? Have a question or improvement idea?
  Let me know.
      
      Table Of Contents