目前我使用的是并行foreach循环,代码看起来像这样。
Parallel.ForEach(ListData, toPost =>
{
try
{
string result = toPost.Post();
if (!result.Contains("Exception"))
{
this.Dispatcher.Invoke(() =>
{
updateLog("Success");
});
}
}
catch (Exception ex)
{
this.Dispatcher.Invoke(() =>
{
updateLog("Exception: " + ex.Message);
});
}
});
然而它有点慢。我试图尽可能多地发布这些HttpWebRequests,我唯一关心的是响应,即更新UI。我读到了有关异步请求的信息,但我们对它们实际上是如何“异步”感到困惑。以及Parallel和Async之间的区别。
我找到了一个问类似问题的人。 Getting the Response of a Asynchronous HttpWebRequest
我可以把它放在for循环中吗?回到我的例子,如果我实现异步,它会像
foreach(toPost in ListData)
{
var task = toPost.PostAsync();
// do something with task
}
根据我对async的理解,无论PostAsync()是否返回任何内容,这都将继续循环?如果是这样,我可以在并行的foreach循环中使用异步,那会更快吗?
对不起如果这些问题很愚蠢。我对这一切都很陌生,并且正在寻找最快捷的方法,我很难理解异步和并行之间的区别,这对我的情况更好。
答案 0 :(得分:0)
Parallel.ForEach
使用线程池线程来执行代码体。由于你的线程大部分时间都在等待I / O操作完成,因此使用昂贵的线程是相当浪费的,这个线程本可以做其他事情。
await
启动I / O调用,但不等待它完成。实际上there is no thread用于异步I / O,因为使用了I / O完成端口。这是一个相当复杂的场景,在前一个链接中得到了最好的解释。
但是,不要混用await
和Parallel.ForEach
,后者与前者的任务和线程不兼容。
如果您想要以异步方式执行多项操作,则可以使用Task.WhenAll
或查看 TPL DataFlow 。
根据我对async的理解,无论PostAsync()是否返回任何内容,这都将继续循环?如果是这样,我可以在并行的foreach循环中使用异步,那会更快吗?
没有。对于循环的每次迭代,您await
Task
,因此下一个操作需要执行,直到任务完成。本质上,循环是串行的,任务也是如此。如果您希望所有任务并行执行,请将其添加为List<Task>
并致电await Task.WhenAll(tasks)
。