C# では、非同期プログラミングで async および await キーワードが使用されます。アプリケーション内で実行されている長いメソッドなどのプロセスが原因で、アプリケーションで UI がブロックされることがあります。このプロセスが終了すると、UI が応答するようになります。
バックグラウンドで実行されているプロセスに関係なくアプリケーションを応答させたい場合は、async および await キーワードを使用してコードを非同期にし、その結果、アプリケーションが既に実行されているときに他のコードの実行を開始できるようになります。他のコードから独立したlongメソッドが実行されています。
構文:
public asyncTask<em>MethodName</em>() { await Task.Run( //user code ); }
上記のステートメントでは、async および await キーワードは、このコードが非同期コードであることを指定します。メソッド「MethodName」は非同期で実行され、アプリケーションをブロックせずに Task.Run() 内のコードを実行します。
逐次および同期プログラミングでは、コードはそれ以上実行されません。つまり、現在のステートメントの動作が終了するまで、次のステートメントは実行されません。このようなタイプの実行では、長い計算に時間がかかり、アプリケーションが応答しなくなる場合があります。このような状況を克服するには、async および await キーワードを使用してコードを非同期にすることができます。
たとえば、コード内に 2 つのメソッドがあり、これらのメソッドが互いに独立しているとします。最初の方法は長い計算を実行し、2 番目の方法はアプリケーションの詳細を出力します。最初の方法は、2 番目の方法よりも実行に時間がかかります。コードが同期の場合、最初のメソッドの実行が完了するまで、2 番目のメソッドは実行されません。
一方、最初のメソッドで async および await キーワードを使用して非同期にした場合、最初のメソッドの完了に関係なく 2 番目のメソッドは実行を開始できます。この非同期プログラミングは実行時間が短縮されるため、アプリケーションの応答性が向上し、本質的にユーザーフレンドリーになります。
await キーワードを使用するメソッドはすべて、非同期としてマークする必要があります。 async キーワードはメソッド シグネチャで使用され、このメソッドが非同期メソッドであることをコンパイラに伝えます。オーバーロードされたメソッドに async を適用することもできます。 async と await を使用して非同期コードを記述することは、タスクが複数のスレッドによって実行されることを意味するわけではありませんが、アプリケーションのメイン スレッドがブロックされないことが保証されます。 await なしでは async を使用することはできません。また、async なしでは await を使用することもできません。これらのキーワードを使用して、IO バウンドと CPU バウンドの両方の操作を実行する非同期コードを作成できます。
非同期メソッドでは、await オペレーターは、そのオペランドが対応する非同期操作の実行を終了するまで、そのメソッドの処理をハングさせます。非同期操作の完了後、await オペレーターはこの非同期操作の結果を返します。一方、await オペレーターのオペランドがすでに操作を完了している場合、await オペレーターは対応する非同期メソッドの処理を中断せず、非同期メソッドを中断せずに操作の結果をすぐに返します。 await オペレーターによって非同期メソッドが一時停止されると、その非同期メソッドからの制御は呼び出し側メソッドに戻ります。
async および await キーワードを使用する際に留意すべき点を以下に示します:
以下に例を示します:
コード:
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; } } }
出力:
出力では、上記のプログラムが非同期で実行されたことがわかります。ファイルの読み取りプロセスが開始され、ファイルの読み取り中に、ファイルの読み取りが完了するのを待たずに、ファイル読み取りプロセス後のステートメントの実行が開始されました。
以下の非同期の別の例を見つけて、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# の async および await キーワードは、非同期コードを記述するために使用されます。メソッドが長い計算を実行している場合、または実行にさらに時間がかかる操作がある場合は、アプリケーションの応答性が向上するため、これらの操作を非同期で実行できます。
以上がC# 非同期待機の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。