首頁  >  文章  >  後端開發  >  C# 等待異步

C# 等待異步

WBOY
WBOY原創
2024-09-03 15:31:46679瀏覽

在C#中,async和await關鍵字用於非同步程式設計。有時在我們的應用程式中,UI 會因為某些進程(例如應用程式中執行的長方法)而被阻塞。當此過程結束時,UI 將變得響應。

如果我們希望我們的應用程式無論後台運行的任何進程都能夠響應,那麼我們可以使用async 和wait 關鍵字,這將使我們的程式碼異步,從而允許我們的應用程式在已經執行其他程式碼時開始執行其他程式碼長方法正在執行,它獨立於其他程式碼。

文法:

public asyncTask<em>MethodName</em>()
{
await Task.Run(
//user code
);
}

在上面的語句中,async和await關鍵字指定該程式碼是非同步程式碼。 「MethodName」方法將非同步執行,它將執行 Task.Run() 內的程式碼,而不會阻塞應用程式。

Await 和 Async 在 C# 中如何運作?

在順序和同步程式設計中,程式碼將不會進一步執行,即除非目前語句完成工作,否則不會執行下一語句。這種類型的執行需要更多的時間來進行長時間的計算,有時會使我們的應用程式無回應。為了克服這種情況,我們可以藉助 async 和 wait 關鍵字使程式碼非同步。

例如,如果我們的程式碼中有兩個方法,而這些方法是相互獨立的。第一種方法是進行長時間計算,第二種方法是列印應用程式的一些詳細資訊。第一種方法比第二種方法需要更多的執行時間。如果我們的程式碼是同步的,那麼除非第一個方法完成執行,否則第二個方法將不會執行。

另一方面,如果我們在第一個方法中使用了 async 和await 關鍵字來使其非同步,那麼無論第一個方法是否完成,第二個方法都可以開始執行。這種非同步編程需要更少的執行時間,從而使我們的應用程式更具響應性和用戶友好性。

任何使用await關鍵字的方法都必須標記為非同步。 async 關鍵字用在方法簽章中,告訴編譯器方法是非同步方法。我們也可以將 async 應用於重載方法。使用async和await編寫非同步程式碼並不意味著我們的任務將由多個執行緒執行,但它可以確保應用程式的主執行緒不會被阻塞。我們不能在沒有await 的情況下使用async,也不能在沒有async 的情況下使用await。我們可以使用這些關鍵字編寫非同步程式碼來執行 IO 密集型和 CPU 密集型操作。

在非同步方法中,await 運算子會掛起該方法的處理,直到其運算元完成執行對應的非同步操作。非同步操作完成後,await 運算子傳回本次非同步操作的結果。另一方面,如果await運算子的操作數已經完成其操作,則await運算子不會暫停對應非同步方法的處理,並立即傳回操作結果,而不暫停非同步方法。透過等待運算子暫停非同步方法時,此非同步方法的控制權將傳回呼叫者方法。

使用 async 和 wait 關鍵字時請記住以下幾點:

  • 如果一個方法被標記為非同步,那麼該方法中應該使用await 運算符,否則使用者將從編譯器收到警告,並且該方法將像任何其他正常方法一樣執行。
  • 「async void」只能用於事件處理程序,而不應用於方法,因為事件沒有任何回傳類型。
  • 標記為「async void」的方法拋出的異常無法在方法外捕獲,而且測試這樣的方法非常困難。

C# Await Async 範例

以下是範例:

範例#1

代碼:

using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp4
{
public class Program
{
public static void Main()
{
TaskMethod();
Console.ReadLine();
}
public static async void TaskMethod()
{
Task<int> task = new Task<int>(CountCharacters);
task.Start();
Console.WriteLine("1. Other task executing");
Console.WriteLine("2. Other task executing");
Console.WriteLine("3. Other task executing");
int count = await task;
Console.WriteLine(" Total characters in file: " + count);
Console.WriteLine("1. After executing task");
Console.WriteLine("2. After executing task");
}
//method to count number of characters in file
public static intCountCharacters()
{
int count = 0;
string filePath = @"E:\Content\content.txt";
Console.WriteLine("Reading file");
using (StreamReaderstreamReader = new StreamReader(filePath))
{
//reading the whole content of the file
string fileContent = streamReader.ReadToEnd();
count = fileContent.Length;
}
Console.WriteLine("File reading completed");
return count;
}
}
}

輸出:

C# 等待異步

在輸出中我們可以看到上面的程式是非同步執行的。文件讀取過程開始,在讀取檔案的過程中,不等待檔案讀取完畢,就開始執行讀取檔案過程之後的語句。

範例#2

請在下面找到另一個使用 async 和 wait 計算數字總和直到 1000 的範例。

代碼:

using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp4
{
public class Program
{
public static void Main()
{
TaskMethod();
Console.ReadLine();
}
public static async void TaskMethod()
{
Task<int> task = new Task<int>(AddNumbers);
task.Start();
Console.WriteLine("1. Other task executing");
Console.WriteLine("2. Other task executing");
Console.WriteLine("3. Other task executing");
int total = await task;
Console.WriteLine(" Sum of numbers till 1000: " + total);
Console.WriteLine("1. After executing task");
Console.WriteLine("2. After executing task");
}
//method to add numbers from 1 to 1000
public static intAddNumbers()
{
int count = 0;
Console.WriteLine("Adding numbers");
for (inti = 0; i<= 1000; i++)
{
count += i;
}
return count;
}
}
}

輸出:

C# 等待異步

結論

C#中的async和await關鍵字用於編寫非同步程式碼。如果一個方法正在執行長時間計算,或者有一個操作需要更多時間來執行,那麼我們可以非同步執行這些操作,因此我們的應用程式將做出回應。

以上是C# 等待異步的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:C# 動作委託下一篇:C# 動作委託