为什么C#4.5 async/await WebClient在使用StreamReader ReadToEndAsync时需要lambda方法?

Joh*_*ers 0 c# lambda asynchronous webclient async-await

鉴于:

    public async Task<string> SendRequest(this string url)
    {
        var wc = new WebClient();
        wc.DownloadDataCompleted += (s, e) =>
        {
            var buffer = e.Result;
            using (var sr = new StreamReader(new MemoryStream(buffer)))
            {
                var result = await sr.ReadToEndAsync();
            };
        };
        wc.DownloadDataAsync(new Uri(url));
    }
}
Run Code Online (Sandbox Code Playgroud)

该声明:

var result = await sr.ReadToEndAsync();
Run Code Online (Sandbox Code Playgroud)

在设计器中显示错误,如下所示:"await运算符只能在异步lambda表达式中使用"

在此输入图像描述

我不明白为什么会发生这样的消息,当我查看所有ReadToEndAsync示例时,它们看起来与此代码完全相同.

请指教...

Ser*_*rvy 5

当使用带有TPL的WebClient时,您应该使用Task名称中的方法来获取Task返回的方法,而不是使用基于事件的模式(然后您需要将其转换为任务):

public static async Task<string> SendRequest(this string url)
{
    using (var wc = new WebClient())
    {
        var bytes = await wc.DownloadDataTaskAsync(url);
        using (var reader = new StreamReader(new MemoryStream(bytes)))
            return await reader.ReadToEndAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)