This is a repro of my code, where the return in wait Task<string>.Run (..) sometimes hangs. If it fails, it's mostly on the first call. 
How can I improve it?
using System.Threading.Tasks;
using System.Diagnostics;
private void Button_Click(object sender, RoutedEventArgs e)
{
    // This can be a very huge list
    string[] servers = new string[] { "10.17.100.1", "10.17.100.10", "10.17.100.20" };
    // the max parallel tasks must be limited
    Parallel.ForEach(servers,
        new ParallelOptions { MaxDegreeOfParallelism = 10 },  
        (forServer) =>
    {
        this.Method1Async(forServer).Wait();
    });
    Debug.WriteLine("Finished");
}
private async Task Method1Async(string server)
{
    await this.Method2Async(server);
}
private async Task Method2Async(string server)
{
    Debug.WriteLine("> Method2Async");
    string result = await Task<string>.Run(() =>
    {
        Debug.WriteLine("  Method2Async before return");
        return GetDataFromServer(server);
    });
    Debug.WriteLine("< Method2Async");
}
private string GetDataFromServer(string server)
{
    // any long time running stuff
    Thread.Sleep(10000);
    return "the server data";
}
Wanted output:
> Method2Async
  Method2Async before return
< Method2Async
Finished
Output when return hangs:
> Method2Async
  Method2Async before return
 
    
