Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.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
异步:在asp.net webapi中返回任务或先等待_Asp.net_Asynchronous_Asp.net Web Api - Fatal编程技术网

异步:在asp.net webapi中返回任务或先等待

异步:在asp.net webapi中返回任务或先等待,asp.net,asynchronous,asp.net-web-api,Asp.net,Asynchronous,Asp.net Web Api,您好,我有一个关于webapi上的async/await的小问题。这两种用法之间有区别吗?哪一种被认为是正确的?阅读后,我想变体1更好,因为开销更小,但我需要确定,因此我再次询问;) 备选案文1: public Task<string> Get(){ return Bar(); } 公共任务Get(){ 返回杆(); } 备选案文2: public async Task<string> Get(){ return await Bar(); } 公共异

您好,我有一个关于webapi上的async/await的小问题。这两种用法之间有区别吗?哪一种被认为是正确的?阅读后,我想变体1更好,因为开销更小,但我需要确定,因此我再次询问;)

备选案文1:

public Task<string> Get(){
    return Bar();
}
公共任务Get(){ 返回杆(); } 备选案文2:

public async Task<string> Get(){
    return await Bar();
}
公共异步任务Get(){ 返回等待条(); } 方法:

public async Task<string> Foo(){
    await Task.Delay(5000);
    return "Done";
}

public Task Bar(){
    return Foo();
}
公共异步任务Foo(){
等待任务。延迟(5000);
返回“完成”;
}
公共任务条(){
返回Foo();
}

感谢您的提示

变体2不可能,因为您无法执行

public async Task<string> Get(){
    return await Bar();
}

public Task Bar(){
    return Foo();
}
公共异步任务Get(){ 返回等待条(); } 公共任务条(){ 返回Foo(); }
wait
仅适用于
async
任务栏()
不是
async
。。。这只是
任务

看 上面说

正确的处理方法是等待方法,并使 调用方法异步任务。这将有一个 异步向上遍历代码时的级联效果

话虽如此,您只剩下变体1。对于大多数情况,这是一个很好的选择。如果您觉得AsyncWait会对性能产生负面影响,那么可能是将错误的方法设置为async。但是,你需要再次校准它。对于这个问题,不可能有一个通用的答案来解决所有的方法

另见:


  • 谢谢你的回答!我应该在问之前测试一下。但是现在我有一个问题:这些变量之间有区别吗:异步任务Get(){return await Foo();}或任务Get(){return Foo();}?是的。异步增加了性能开销。但是为什么要使用没有异步的任务呢?好的,很好。这不是生产代码,我只是想了解它是如何工作的。非常感谢。如果您对top方法使用了async,那么在所有后续子方法中使用它是安全的,因为async侦听将保持不变。确定。对于asp.net WebAPI,如果我将一个方法声明为“async Task Get()”并在Get中等待TaskX,或者如果我将其声明为“Task Get()”并直接返回TaskX,则没有区别,对吗?