并非 .NET Framework 的所有类都引入了新的异步方法。在使用框架中的不同类时会发现,还有许多类只提供了 BeginXXX 方法和 EndXXX 方法的异步模式,没有提供基于任务的异步模式。但是,可以把异步模式转换为基于任务的异步模式。.
这个示例使用 HttpWebRequest 类和 BeginGetResponse 方法将该方法转换为基于任务的异步模式。Task.Factory.FromAsync 是一个泛型方法,它提供了一些重载版本,将异步模式转换为基于任务的异步模式。对于示例应用程序,当调用 HttpWebRequest 的 BeginGetResponse 方法时,将发出异步网络请求。这个方法返回一个 IAsyncResult,它是 FromAsync 方法的第一个参数。第二个参数是对 EndGetResponse 方法的引用,它需要一个带有 IAsyncResult 参数(即 End GetResponse 方法)的委托。第二个参数还需要返回 WebResponse,由 FromAsync 方法的泛型参数决定。当 IAsyncResult 信号完成时,任务助手功能会调用 EndGetResponse 方法:
private static async void ConvertingAsyncPattern()
{
HttpWebRequest request = WebRequest.Create("http://www.microsoft.com")
as HttpWebRequest;
using (WebResponse response = await Task.Factory.FromAsync<WebResponse>(
request.BeginGetResponse(null, null), request.EndGetResponse))
{
Stream stream = response.GetResponseStream();
using (var reader = new StreamReader(stream))
{
string content = reader.ReadToEnd();
Console.WriteLine(content.Substring(0,100));
}
}
}
警告:
在旧应用程序中,通常在使用异步模式时使用委托的 BeginInvoke() 方法。在 .NET Core 应用程序中使用此方法时,编译器不会报错。但是,在运行时,将抛出一个平台不支持的异常。