Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# 异步/等待模式的使用范围应该有多广?_C#_.net_Asp.net Web Api_Async Await_Asp.net Web Api2 - Fatal编程技术网

C# 异步/等待模式的使用范围应该有多广?

C# 异步/等待模式的使用范围应该有多广?,c#,.net,asp.net-web-api,async-await,asp.net-web-api2,C#,.net,Asp.net Web Api,Async Await,Asp.net Web Api2,我就此事发表了以下评论: “另外,在较新版本的.Net中使用异步等待模式将使效率更接近于事件驱动架构(如NodeJS和Nginx)。” 我继承了一个WebAPI应用程序,其中所有层中的所有方法基本上都利用了异步/等待模式。上面关于async/await性能的评论非常引人注目。在Web API应用程序的所有层的所有方法上实现async/await是否合适?是否有任何情况下我应该避免wait/async或小心不要过度使用它?我建议阅读我的 在Web API应用程序的所有层的所有方法上实现async/

我就此事发表了以下评论:

“另外,在较新版本的.Net中使用异步等待模式将使效率更接近于事件驱动架构(如NodeJS和Nginx)。”

我继承了一个WebAPI应用程序,其中所有层中的所有方法基本上都利用了异步/等待模式。上面关于async/await性能的评论非常引人注目。在Web API应用程序的所有层的所有方法上实现async/await是否合适?是否有任何情况下我应该避免wait/async或小心不要过度使用它?

我建议阅读我的

在Web API应用程序的所有层的所有方法上实现async/await是否合适

对。事实上,这是必须的
async
只有在您一直使用它的情况下才真正起作用(就提供从
async
中获得的好处而言)。因此,如果您的实现异步调用另一个API,那么应该异步使用该方法,等等,直到您的初始控制器操作

特别是,您希望避免通过异步反模式进行同步

是否有任何情况下我应该避免wait/async或小心不要过度使用它

对。你应该避免“假异步”。这是开发人员使用
任务的反模式。运行
(或类似)以获取任务,以便他们可以“使用异步”。通常是这样的:

int GetId() { ... }
Task<int> GetIdAsync() => Task.Run(() => GetId());
...
var id = await GetIdAsync(); // Look, I'm async! (not really)
int GetId(){…}
任务GetIdAsync()=>Task.Run(()=>GetId());
...
var id=await GetIdAsync();//看,我是异步的!(不太可能)
在这种情况下,代码损害了您的可伸缩性,而不是帮助它。

我建议您阅读我的

在Web API应用程序的所有层的所有方法上实现async/await是否合适

对。事实上,这是必须的
async
只有在您一直使用它的情况下才真正起作用(就提供从
async
中获得的好处而言)。因此,如果您的实现异步调用另一个API,那么应该异步使用该方法,等等,直到您的初始控制器操作

特别是,您希望避免通过异步反模式进行同步

是否有任何情况下我应该避免wait/async或小心不要过度使用它

对。你应该避免“假异步”。这是开发人员使用
任务的反模式。运行
(或类似)以获取任务,以便他们可以“使用异步”。通常是这样的:

int GetId() { ... }
Task<int> GetIdAsync() => Task.Run(() => GetId());
...
var id = await GetIdAsync(); // Look, I'm async! (not really)
int GetId(){…}
任务GetIdAsync()=>Task.Run(()=>GetId());
...
var id=await GetIdAsync();//看,我是异步的!(不太可能)

在这种情况下,代码损害了您的可伸缩性,而不是有助于它。

如果您要异步,您通常希望一路异步。您不需要在没有任何I/O的API中使用
async/wait
。“所有层中的所有方法”对我来说都是一个巨大的危险信号。我不知道你是怎么想的,但我从来没有享受过一个“所有层中的所有方法”都是异步的应用程序。并非每个进程都是异步友好的(即具有多个步骤的串行进程)。。古老的JavaScript圣诞树图案的噩梦在我脑海中回荡。应该用到那种程度吗?99%的答案是不可能的。如果你要异步,你通常希望一路异步。你不需要在没有任何I/O的API中使用
async/await
。“所有层中的所有方法”对我来说都是一个巨大的危险信号。我不知道你是怎么想的,但我从来没有享受过一个“所有层中的所有方法”都是异步的应用程序。并非每个进程都是异步友好的(即具有多个步骤的串行进程)。。古老的JavaScript圣诞树图案的噩梦在我脑海中回荡。应该用到那种程度吗?99%的答案是不可能的。我要提醒大家,笼统的说法“这是必须的……一路使用它”并不完全准确。无论后端决定做什么,我都可以创建一个响应良好的UI体验。我喜欢async,但和其他任何工具一样,它可能会被过度使用,并带来维护成本。有些进程是串行的,这没关系。我宁愿保持这种方式,也不愿尝试使用
whalll
或类似的方式来管理和链接此类异步任务。@P.Brian.Mackey:澄清一下,我的意思是在同一个过程中,而不是在网络堆栈中“一直使用它”。我要提醒大家,“这是必须的……一直使用它”的笼统说法并不完全准确。无论后端决定做什么,我都可以创建一个响应良好的UI体验。我喜欢async,但和其他任何工具一样,它可能会被过度使用,并带来维护成本。有些进程是串行的,这没关系。我宁愿保持这种方式,也不愿尝试使用
whalll
或诸如此类的工具来管理和链接此类异步任务。@P.Brian.Mackey:澄清一下,我的意思是在同一个过程中,而不是跨网络堆栈“一直使用它”。