据我所知,WebRequest.GetResponseAsync()可以等待,并且是异步的。但是当我在https://referencesource.microsoft.com/#System/net/System/Net/WebRequest.cs,99a2a9c8ebc067dc查看其源代码时它不是用“ async”关键字定义的。
我以为您不能等待未定义为“异步”的方法?
我以为您不能等待未定义为“异步”的方法?
这是一种思考的“速记”方式,在最初学习async
时可能会有用,但是当您获得有关async
/ await
的更多知识时,它就会瓦解。这句话中有两个概念不太正确。
首先,代码无法await
方法。实际发生的情况是该方法被调用,就像其他任何方法一样。该方法返回一个值-一种awaitable类型-实际等待的是该返回值。我们通常谈论“等待方法”,但这只是“调用方法并等待其返回值”的简写,它更准确,但对于大多数对话而言却很尴尬。
其次,async
只是一种方法以创建一个等待的返回值(然后可以等待它)。还有其他几种方法。例如,如果您有使用Task<T>.Factory.FromAsync
的API,并且您想将其与older APM asynchronous pattern一起使用,则通常使用await
。在这种情况下,您通常会选择write wrapper methods that return Task<T>
and are implemented using Task<T>.Factory.FromAsync
(without async
)。另一种常见方法是使用Task<T>
,即Task<T>.Factory.FromAsync
。
换句话说,async
是一个实现细节。接口方法可以声明为返回TaskCompletionSource<T>
并等待,但是只有方法implementations可以声明为can create a Task<T>
around any kind of logical "future event"。