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

问题描述 投票:0回答:1

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

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

c# asynchronous webrequest
1个回答
0
投票

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

这是一种思考的“速记”方式,在最初学习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"

© www.soinside.com 2019 - 2024. All rights reserved.