【发布时间】:2020-05-31 12:05:54
【问题描述】:
这是我的代码的复制品,wait Task<string>.Run (..) sometimes 中的返回挂起。如果失败,则主要是第一次通话。
我该如何改进它?
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";
}
想要的输出:
> Method2Async
Method2Async before return
< Method2Async
Finished
返回挂起时的输出:
> Method2Async
Method2Async before return
【问题讨论】:
-
不要在任务中使用
.Wait()。 -
“等待 Parallel.ForEach 完成”是什么意思?这是一个同步调用,直到所有并行任务完成后才返回。
-
IIRC,await 告诉编译器和运行时“重新洗牌,使函数的其余部分成为回调”。 Wait() 只是一个函数调用。 Await 与括号相当,甚至略高于括号。很容易让他们感到困惑。
-
请更新您的问题,没有
anydata -
您可能会觉得这很有趣:How to limit the amount of concurrent async I/O operations?。问题中还有一个嵌套的
Parallel.ForEach,看起来像是成绩单错误。
标签: c# async-await parallel.foreach