繁体   English   中英

控制台应用程序中的异步等待是否与 GUI 和 ASP.NET 应用程序一样有用?

[英]Is Async Await in Console apps as useful as GUI and ASP.NET apps?

我目前正在学习 C# 异步/等待功能,可以看到它在 GUI 和 web 应用程序中的用处,但我仍在尝试弄清楚它在控制台应用程序中的真正用处。 你能举一个例子来说明这一点吗?

异步允许在等待任务之前运行更多代码,因此如果有更多代码可以同时运行(意思是 - 它不依赖于其他任务),它可以立即开始。

例如:

public async Task<string> GetUserFullNameAsync(string firstName)
{
   return await GetUserFullNameAsyncInner(firstName); // gets user name from db in an async fashion - takes 4 seconds
}

public async Task<DateTime> GetFlightTimeAsync(string filghtName)
{
   return await GetFlightTimeAsyncInner(filghtName); // gets filget time from db in as async fashion - takes 4 seconds
}

public async Task<UserDetails> GetUserDetailsAsync(string userFullName)
{
   return await GetUserDetailsAsyncInner(name); // gets user details by its full name from db in an async fashion - takes 4 seconds
}

让我们看看这个 function:

public async <UserDetails> GetUserDetails(string firstName)
{
   var userFullName = await GetUserDetailsAsync(firstName);
   return await GetUserDetailsAsync(userFullName);
}

请注意GetUserDetailsAsync如何依赖于首先使用GetUserDetailsAsync获取全名。 因此,如果您需要获取 UserDetails object,则需要等待GetUserDetailsAsync完成。 这可能需要一些时间——尤其是对于视频处理等较重的操作。 在此示例中 - 第一个 function 4 秒 + 秒 4 秒 = 8 秒。

现在让我们看看第二个 function:

public async <FlightDetails> GetUserFlightDetails(string firstName, string flightName)
{
   var userFullNameTask = GetUserDetailsAsync(firstName);
   var flightTimeTask = GetFlightTimeAsync(flightName);

   await Task.WhenAll(userFullNameTask, flightTimeTask);
   return new FlightDetails(await userFullNameTask, await flightTimeTask);
}

请注意, GetFlightTimeAsync不依赖于任何其他 function,因此如果您需要说出用户全名和飞行时间,您可以并行进行,因此这两个操作会同时处理 - 因此等待的总时间为比获取全名然后获取飞行时间更快。 第一个 4 秒 function + 第二个 4 秒 - 以并行方式 < 8 秒。

让我们从一个不同的角度来看异步编程,而不仅仅是一种并行处理方式。 是的,您可以并行运行任务,但您会发现有太多代码使用 await/async,但它正在等待每次异步执行。

这样做的意义何在? 那里没有并行执行...

一切都是为了更好地利用可用的系统资源,尤其是线程。

一旦执行到异步代码,就可以释放线程,并且线程是有限的系统资源。 通过在空闲时释放线程以完成 IO 绑定工作,它可以用于处理另一个请求。 它还可以防止使用量激增,因为调度程序不会突然发现自己缺少线程来处理新请求。 选择异步操作而不是同步操作不会加快操作速度。 这将花费相同的时间(甚至更多)。 它只是使该线程能够继续执行其他一些受 CPU 限制的工作,而不是浪费资源。

如果您有任何 I/O 绑定需求(例如从网络请求数据、访问数据库或读取和写入文件系统),您将希望使用异步编程。 无论应用程序是否是控制台应用程序。

奖励:如果您想知道:“好吧,我的应用程序释放了线程,但一定有其他线程在等待!” 看看Stephen Cleary的这篇文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM