在控制台应用程序中的Async Await与GUI和ASP一样有用吗?网络应用程序?



我目前正在学习c# Async/Await功能,可以看到它在GUI和web应用程序中的用处,但我仍然试图找出它在控制台应用程序中的真正用处。你能举个例子说明这一点吗?

Async允许运行更多的代码,直到等待任务,所以如果有更多的代码可以同时运行(意思是-它不依赖于其他任务),它可以立即开始。

例如:

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
}

让我们看看这个函数:

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

注意GetUserDetailsAsync是如何依赖于通过使用GetUserDetailsAsync先获得全名的。因此,如果您需要获得UserDetails对象,则依赖于等待GetUserDetailsAsync完成。这可能需要一些时间,特别是对于像视频处理之类的较重的操作。在本例中-第一个函数用4秒+第二个函数用4秒= 8秒。

现在让我们看看第二个函数:

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不依赖于任何其他函数,所以如果您需要说用户全名和飞行时间,您可以以并行的方式进行,因此两个操作在同一时间内处理-因此等待的总时间比获取全名然后获取飞行时间要快。第一个函数4秒+第二个函数4秒-以并行方式<8秒。

让我们从不同的角度来看异步编程,而不仅仅是并行处理事情的方式。是的,你可以并行运行任务,但你会发现很多代码使用await/async,但它在每次异步执行时都在等待。

这样做的意义是什么?这里没有并行执行…

它是关于更好地利用可用的系统资源,特别是线程。

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

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

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

相关内容

  • 没有找到相关文章