Async Post HttpWebRequests,Handling Response&更新用户界面

时间:2017-11-22 09:01:24

标签: c# asynchronous post httpwebrequest

目前我使用的是并行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循环中使用异步,那会更快吗?

对不起如果这些问题很愚蠢。我对这一切都很陌生,并且正在寻找最快捷的方法,我很难理解异步和并行之间的区别,这对我的情况更好。

1 个答案:

答案 0 :(得分:0)

Parallel.ForEach使用线程池线程来执行代码体。由于你的线程大部分时间都在等待I / O操作完成,因此使用昂贵的线程是相当浪费的,这个线程本可以做其他事情。

异步I / O操作上的

await启动I / O调用,但不等待它完成。实际上there is no thread用于异步I / O,因为使用了I / O完成端口。这是一个相当复杂的场景,在前一个链接中得到了最好的解释。

但是,不要混用awaitParallel.ForEach,后者与前者的任务和线程不兼容。

如果您想要以异步方式执行多项操作,则可以使用Task.WhenAll或查看 TPL DataFlow

  

根据我对async的理解,无论PostAsync()是否返回任何内容,这都将继续循环?如果是这样,我可以在并行的foreach循环中使用异步,那会更快吗?

没有。对于循环的每次迭代,您await Task,因此下一个操作需要执行,直到任务完成。本质上,循环是串行的,任务也是如此。如果您希望所有任务并行执行,请将其添加为List<Task>并致电await Task.WhenAll(tasks)