C# 非同期

WBOY
WBOYオリジナル
2024-09-03 15:31:52644ブラウズ

非同期に実行される C# の特別なメソッドは非同期メソッドと呼ばれ、メソッドは修飾子 async を使用して非同期にすることができ、C# の非同期メソッドを使用して非同期タスクを実行でき、メソッドの実行は await 式を使用して一時停止できます。 C# の場合、この await 式が修飾子 async を持つメソッドに存在しない場合、そのメソッドが非同期メソッドであり、非同期メソッドの戻り値の型が Task、Task、 Void (イベント ハンドラー用) および System.Threading.Tasks.ValueTask.

C# 非同期メソッドの構文:

public async Task<int> Method_name()
{
// Block of code
}
  • async は使用される修飾子です。
  • Methodname はメソッドに与えられた名前です。

C# での非同期メソッドの動作

  • プログラム内のロジックで待機可能なタスクの使用が必要な場合は常に、Web から何かをダウンロードしたり、巨大なファイルを読み取ったり、計算を実行したりするなど、完了までに長時間かかる操作を実行できる非同期メソッドを利用します。これらは非常に複雑ですが、アプリケーションの通常の実行を妨げたりブロックしたりすることはありません。これは、プログラム内で修飾子 async と await を使用することで可能になります。
  • 非同期メソッドは、プログラムのフローに関係のないタスクを実行する、それに関連付けられたタスクとは別に呼び出され、タスクを完了できるまで待機させられ、次のようにそれぞれの値を返します。その定義は次のステートメントで使用できます。または、制御が非同期メソッドの呼び出し元に移動し、タスクの実行を中断することなくプログラムの実行を再開している間、まだタスクを実行している可能性があり、タスクが完了すると、非同期メソッドの残りの部分が実行され、その定義に従ってそれぞれの値が返されます。

C# 非同期の例

以下に挙げる例を示します:

例 #1

ファイルの内容を読み取り、ファイル内の文字数のカウントを決定するプログラム内の非同期メソッドを示す C# プログラム。

コード:

using System;
using System.IO;
using System.Threading.Tasks;
//a class called check is defined
class Check
{
//main method is called
public static void Main()
{
//a file is created
String pat = @"D:\Ext.txt";
//an instance of the string writer class is created, and the path of the file is passed as a parameter to append text to the file
using (StreamWritersw = File.AppendText(pat))
{
//data to be appended to the file is included
sw.WriteLine("Welcome to StreamWriter class in C#");
//the instance of the streamwriter class is closed after writing data to the File
sw.Close();
}
//ReadFileusingAsync method is called by creating a task and the control moves to ReadFileusingAsync method
Task<int>taskname = ReadFileusingAsync();
//When the control reaches await modifier in ReadFileusingAsync method, the control returns here as the task is still going on and the following statements are executed
Console.WriteLine("Task is being performed by the asynchronous method and we are asked to wait until the completion of the task using await method");
string givemeinput = Console.ReadLine();
Console.WriteLine("The flow of the program is resumed once the task is completed by the asynchronous method and the value is returned " + givemeinput);
//We are waiting to receive the value from the task of asynchronous method in case the value is not returned yet.
taskname.Wait();
//We have used Result method to obtain the value returned from the asynchronous method after the completion of task assigned to it
var z = taskname.Result;
Console.WriteLine("The number of characters in the file are: " + z);
Console.WriteLine("The program has completed its normal execution and the asynchronous method has read the file to count the number of characters in the file");
Console.ReadLine();
}
static async Task<int>ReadFileusingAsync()
{
string fileread = @"D:\Ext.txt";
//The following statements are executed which can take a longer time
Console.WriteLine("We have opened the file to read the contents of the file");
int counter = 0;
using (StreamReader read = new StreamReader(fileread))
{
//await modifier is used to ask the caller function to wait till the reading of the file is complete
string vart = await read.ReadToEndAsync();
counter += vart.Length;
//This is the unnecessary code that is time consuming we have included for the sake of explanation
for (int r = 0; r < 20000; r++)
{
int z = vart.GetHashCode();
if (z == 0)
{
counter--;
}
}
}
Console.WriteLine("We are done reading the file");
return counter;
}
}

出力:

C# 非同期

説明:

  • 上記のプログラムでは、check というクラスが定義され、次に main メソッドが呼び出され、その中でファイルを作成し、内容をファイルに書き込みます。
  • 次に、非同期メソッド ReadFileusingAsync を呼び出すタスクが作成され、コントロールはそのメソッドに移動し、そこでファイルの内容を読み取るタスクが実行されます。
  • 次に、ファイルの内容を読み取るときに length 関数を使用して文字の長さを取得し、呼び出したメソッドに同じ長さを返します。
  • 呼び出したメソッドは、制御が戻るまで待機し、その後、プログラムの通常のフローが再開されて結果が表示されます。

例 #2

プログラム内で非同期メソッドをデモンストレーションするための C# プログラム。

コード:

using System;
using System.Threading.Tasks;
//a class called check is defined
class Check
{
static void Main()
{
while (true)
{
//the asynchronous method is called.
keeptrying();
string res = Console.ReadLine();
Console.WriteLine("The input given by the user while the computation is going on by the asynchronous method is: " + res);
}
}
static async void keeptrying()
{
//the caller function is asked to await
int t = await Task.Run(() =>compute());
Console.WriteLine("The total digits count in the string is: " + t);
}
static intcompute()
{
int counter = 0;
for (int a = 0; a < 10; a++)
{
for (int b = 0; b < 1000; b++)
{
string value = b.ToString();
counter += value.Length;
}
}
return counter;
}
}

出力:

C# 非同期

説明:

  • 上記のプログラムでは、check というクラスが定義されています。
  • その後、メイン メソッドが呼び出され、その中で非同期メソッドが呼び出され、制御が非同期メソッドに移動します。そこで文字列内の桁の総数が計算され、メイン メソッドが表示を続ける間、呼び出し元のメソッドに待機するように要求されます。ユーザーが提供した入力。

以上がC# 非同期の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:C# 非同期待機次の記事:C# 非同期待機