使用异步方法的HttpWebRequest - 需要澄清

时间:2011-03-03 10:55:21

标签: c# asynchronous

我非常熟悉将APM用于支持APM的类。然而,HttpWebRequest类有一个我在其他任何类中都没有注意到的细微差别。更令人困惑的是,只要我看到以异步方式使用HttpWebRequest的代码,它就会跳过我所拥有的问题。

所以这里说:当使用HttpWebRequest类进行POST时,基本上有两种方法需要异步调用。

  1. BeginGetRequestStream / EndGetRequestStream
  2. BeginGetResponse / EndGetResponse
  3. 我看到的大部分代码都跳过调用第一个而只调用第二个代码。使用Tasks和Task.Factory.FromAsync方法的示例也“方便地”跳过此。

    我知道在调用BeginGetRequestStream方法时正在建立连接。哪个是I / O限制并且需要一定的时间。

    所以我的问题是:如果有兴趣以正确的方式做到这一点:

    1. 不应该调用Begin / End GetRequestStream方法然后再调用BeginGetResponse吗?
    2. 使用Task.Factory.FromAsync,是否有一种简单的方法来调用这两种方法?除了FromAsync,然后继续和另一个FromAsync?

2 个答案:

答案 0 :(得分:2)

正确的方法(在做帖子时)是调用那些asycn方法。原因是(正如你所提到的那样),调用EndGetRequestStream(而不是BeginGetRequestStream)建立连接,这可能需要一段时间,所以如果你不使用这对方法,那么你的主线程将阻止在那个时期。因此,如果性能在您的情况下是关键,则应该同时调用两种异步方法。

关于使用任务。我不知道你称之为“简单”,但我有一篇博文,内容涉及各种风格的http帖子,包括一些使用任务的选项。 HttpWebRequest - Asynchronous Programming Model/Task.Factory.FromAsyc

特别是在第一个代码列表中,PostAsyncTask是您正在寻找的方法。在我进行的各种性能测试中,我发现非任务版本(称为PostAsync的方法)执行得稍微好一些。就个人而言,我没有找到(在这种情况下,任务版本也简化了任何事情。

答案 1 :(得分:1)

调用Begin / End GetRequestStream仅在写入请求正文时才需要。如果您没有发送正文(即GET),则可以跳过它。

我没有意识到在没有继续的情况下直接使用其他任务执行任务的方法。This question显示了链接任务的可能方法。您可以编写具有类似样式的扩展方法。