据我所知,WebRequest.GetResponseAsync()可以等待,并且是异步的。 但是当我在https://referencesource.microsoft.com/#System/net/System/Net/WebRequest.cs,99a2a9c8ebc067dc查看其源代码时 它不是用“ async”关键字定义的。
我以为您不能等待未定义为“异步”的方法?
答案 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
。