title: Best way to call functions asynchronously
body: <p>I trying get a string to set three label text asynchronously, Firstly I tried with this</p>
  
  <pre><code>private async void button1_Click(object sender, EventArgs e)
  {
      label1.Text = await SetTextbox(3);
      label2.Text = await SetTextbox(2);
      label3.Text = await SetTextbox(1);
  }
  
  private async Task&lt;string&gt; SetTextbox(int delaySeconds)
  {
      Thread.Sleep(delaySeconds * 1000);
      return "Done.";
  }
  </code></pre>
  
  <p>As you can see I try to add some delay in every call to know what label text should be set first, but this code doesn't work, the GUI still freezing and the processes still being synchronous.</p>
  
  <p>For now I make it work using Task.Run:</p>
  
  <pre><code>private async void button1_Click(object sender, EventArgs e)
  {
       var proc1 = Task.Run(async () =&gt; { label1.Text = await SetTextbox(3); });
       var proc2 = Task.Run(async () =&gt; { label2.Text = await SetTextbox(2); });
       var proc3 = Task.Run(async () =&gt; { label3.Text = await SetTextbox(1); });
  
       await Task.WhenAll(proc1, proc2, proc3);
  }
  </code></pre>
  
  <p>but something tells me that this is not right way to achieve this, Can you tell me what would be the best way to do this or this is good solution?</p>