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