为什么WebRequest.GetResponseAsync()不异步?

时间:2019-09-27 15:22:43

标签: c# asynchronous webrequest

据我所知,WebRequest.GetResponseAsync()可以等待,并且是异步的。 但是当我在https://referencesource.microsoft.com/#System/net/System/Net/WebRequest.cs,99a2a9c8ebc067dc查看其源代码时 它不是用“ async”关键字定义的。

我以为您不能等待未定义为“异步”的方法?

1 个答案:

答案 0 :(得分:1)

  

我以为您不能等待未定义为“异步”的方法?

这是一种思考的“速记”方式,在最初学习async时可能很有用,但是当您对async / await有了更多的了解时,它就会瓦解。这句话有两个概念不太正确。

首先,代码无法await方法。实际发生的情况是该方法被调用,就像其他任何方法一样。该方法返回一个值-一种 awaitable 类型-实际等待的是该返回值。我们通常谈论“等待方法”,但这只是“调用方法并等待其返回值”的简写,它更准确,但对于大多数对话而言却很尴尬。

第二,async只是创建可等待的返回值(然后可以等待)的一种方法。还有其他几种方法。例如,如果您有一个使用older APM asynchronous pattern的API,并且想与Task<T>.Factory.FromAsync一起使用,则通常使用await。在这种情况下,您通常会write wrapper methods that return Task<T> and are implemented using Task<T>.Factory.FromAsync (without async)。另一种常见的方法是使用can create a Task<T> around any kind of logical "future event"TaskCompletionSource<T>

换句话说,async是实现细节。接口方法可以声明为返回Task并等待,但只有方法 implementations 可以声明为async