Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C#4.5 async/await WebClient在使用StreamReader ReadToEndAsync时需要lambda方法?_C#_Asynchronous_Lambda_Webclient_Async Await - Fatal编程技术网

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

为什么C#4.5 async/await WebClient在使用StreamReader ReadToEndAsync时需要lambda方法?,c#,asynchronous,lambda,webclient,async-await,C#,Asynchronous,Lambda,Webclient,Async Await,鉴于: 显示设计器中的错误,如下所示:“await运算符只能在异步lambda表达式中使用” 我不明白为什么会出现这条消息,当我查看所有ReadToEndAsync示例时,它们看起来与此代码一模一样 请通知…公共静态任务发送请求(此字符串url) var result = await sr.ReadToEndAsync(); { return(new WebClient()).downloadstringtasksync(新Uri(url)); } 公共静态任务发送请求(此字符串url) {

鉴于:

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

我不明白为什么会出现这条消息,当我查看所有ReadToEndAsync示例时,它们看起来与此代码一模一样

请通知…

公共静态任务发送请求(此字符串url)
var result = await sr.ReadToEndAsync();
{ return(new WebClient()).downloadstringtasksync(新Uri(url)); }
公共静态任务发送请求(此字符串url)
{
return(new WebClient()).downloadstringtasksync(新Uri(url));
}

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

公共静态异步任务SendRequest(此字符串url)
{
使用(var wc=new WebClient())
{
var bytes=wait wc.DownloadDataTaskAsync(url);
使用(var reader=newstreamreader(newmemoryStream(字节)))
return wait reader.ReadToEndAsync();
}
}

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

公共静态异步任务SendRequest(此字符串url)
{
使用(var wc=new WebClient())
{
var bytes=wait wc.DownloadDataTaskAsync(url);
使用(var reader=newstreamreader(newmemoryStream(字节)))
return wait reader.ReadToEndAsync();
}
}


lamda(这里不是一个表达式)本身就是一个方法,隐藏和伪造以允许访问包含范围内的绑定。和
await
只能用于
async
方法(或所说的async lambdas come方法)。它不需要lambda,它需要async方法或async lambda。您不需要lambda。您的await不对应于外部方法,而是对应于lambda,并且lambda不是异步的。这是因为您决定将基于库async/await任务的方法后缀为
async
。但是,在
WebClient
的情况下,正如您所发现的,已经有以
Async
结尾的方法,因此在这种情况下,使用后缀
taskaync
命名更为明确。lamda(这里不是表达式)本身就是一种方法,隐藏并伪造以允许访问包含范围中的绑定。和
await
只能用于
async
方法(或所说的async lambdas come方法)。它不需要lambda,它需要async方法或async lambda。您不需要lambda。您的await不对应于外部方法,而是对应于lambda,并且lambda不是异步的。这是因为您决定将基于库async/await任务的方法后缀为
async
。然而,在
WebClient
的情况下,正如您所发现的,已经有以
Async
结尾的方法,因此在本例中,命名更明确,后缀为
taskaync
。您还没有返回,因为我试图理解这个问题。。。你知道,边走边编码…1。出了什么问题?A.使Lambda异步2。原始代码编译了吗?A.第三。作者是否抱怨它没有编译?A.第四。这个问题的解决方案是什么?A.在lambda 5前面添加async关键字。我最初的回答解决了这个问题吗?是的。让我提醒你一个问题——我不明白为什么这个消息正在发生(Acess)操作符只能在异步的lambda表达式中使用。考虑用“AsiNC”修改器标记这个lambda表达式。看起来好像你放弃了尝试修复第一个片段。当然,这不是不可能的,这只是一项相当多的工作。不,我甚至没有尝试,发现它毫无意义,将把它作为一种锻炼留到下一天。不管怎样,我现在离开了,谢谢,我学到了一个新的东西返回等待任务实际上并没有阻止:-DYa还没有返回,因为我试图理解这个问题。。。你知道,边走边编码…1。出了什么问题?A.使Lambda异步2。原始代码编译了吗?A.第三。作者是否抱怨它没有编译?A.第四。这个问题的解决方案是什么?A.在lambda 5前面添加async关键字。我最初的回答解决了这个问题吗?是的。让我提醒你一个问题——我不明白为什么这个消息正在发生(Acess)操作符只能在异步的lambda表达式中使用。考虑用“AsiNC”修改器标记这个lambda表达式。看起来好像你放弃了尝试修复第一个片段。当然,这不是不可能的,这只是一项相当多的工作。不,我甚至没有尝试,发现它毫无意义,将把它作为一种锻炼留到下一天。不管怎样,我现在离开了,谢谢,我学到了一个新的东西:返回等待任务实际上不会阻塞:-D@MichalCiechan我很惊讶你花了这么长时间否决了一个正确的答案,这样你的错误答案就可以更明显地向任何可能真正在寻找问题解决方案的人传达错误的信息。很明显,你来这里只是为了吸引其他用户,并试图积极地让其他人的生活变得更糟,只是为了好玩。哈哈,你是如何从消极开始的?你试过整理你的答案吗?正如您喜欢说的:它甚至不编译!不管怎样,请告诉我为什么我的答案是错的?是的,我不知道为什么,我也看不出为什么。唯一的问题是我不是100%确定,如果你返回等待任务,它会立即阻止吗?还是只是等待?不,我不是100%精通第三方物流。。。。对不起…@MichalCiechan你当然可以。我不知道你为什么会认为你做不到。是的,对不起,我试过了
var result = await sr.ReadToEndAsync();
    public static Task<string> SendRequest(this string url)
    {
        return (new WebClient()).DownloadStringTaskAsync(new Uri(url));
    }
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();
    }
}