簡體   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