Dart-programming-async

提供:Dev Guides
移動先:案内検索

Dartプログラミング-非同期

非同期操作*は、 *main アプリケーションスレッドとは別のスレッドで実行されます。 アプリケーションがメソッドを呼び出して操作を非同期的に実行する場合、非同期メソッドがタスクを実行している間、アプリケーションは実行を継続できます。

この概念を理解するために例を見てみましょう。 ここで、プログラムは* IOライブラリ*を使用してユーザー入力を受け入れます。

import 'dart:io';
void main() {
   print("Enter your name :");

  //prompt for user input
   String name = stdin.readLineSync();

  //this is a synchronous method that reads user input
   print("Hello Mr. ${name}");
   print("End of main");
}
  • readLineSync()は同期メソッドです。 つまり、 readLineSync()関数呼び出しに続くすべての命令の実行は、 readLineSync()*メソッドの実行が完了するまでブロックされます。

    *stdin.readLineSync* は入力を待機します。 トラックで停止し、ユーザーの入力を受け取るまでそれ以上実行しません。

上記の例では、次の*出力*になります-

Enter your name :
Tom

//reads user input
Hello Mr. Tom
End of main

コンピューティングでは、続行する前にイベントが発生するのを待つとき、何かが*同期*であると言います。 このアプローチの欠点は、コードの一部の実行に時間がかかりすぎると、後続のブロックは無関係ですが実行がブロックされることです。 リソースに対する複数の要求に応答する必要があるWebサーバーを検討します。

同期実行モデルは、現在のリクエストの処理が完了するまで、他のすべてのユーザーのリクエストをブロックします。 そのような場合、Webサーバーのように、すべての要求は他の要求から独立している必要があります。 つまり、ウェブサーバーは、他のユーザーからのリクエストに応答する前に、現在のリクエストの実行が完了するのを待つべきではありません。

簡単に言えば、以前のユーザーの要求を必ず完了する前に、新しいユーザーからの要求を受け入れる必要があります。 これは非同期と呼ばれます。 非同期プログラミングとは、基本的に、待機またはノンブロッキングプログラミングモデルがないことを意味します。 dart:async パッケージは、Dartスクリプトでの非同期プログラミングブロックの実装を容易にします。

次の例は、非同期ブロックの機能をよりよく示しています。

ステップ1 *-以下に示す *contact.txt ファイルを作成し、*現在のプロジェクトのデータフォルダーに保存します。

1, Tom
2, John
3, Tim
4, Jane
  • ステップ2 *-アプリケーションの他の部分をブロックせずにファイルを読み取るプログラムを作成します。
import "dart:async";
import "dart:io";

void main(){
   File file = new File( Directory.current.path+"\\data\\contact.txt");
   Future<String> f = file.readAsString();

  //returns a futrue, this is Async method
   f.then((data)=>print(data));

  //once file is read , call back method is invoked
   print("End of main");
  //this get printed first, showing fileReading is non blocking or async
}

このプログラムの*出力*は次のようになります-

End of main
1, Tom
2, John
3, Tim
4, Jan

「メインの終わり」が最初に実行され、スクリプトがファイルの読み取りを続けます。 dart:async の一部である Future クラスは、非同期タスクの完了後に計算の結果を取得するために使用されます。 この Future 値は、計算が終了した後に何かをするために使用されます。

読み取り操作が完了すると、実行制御は "then()" 内で転送されます。 これは、読み取り操作に時間がかかるため、プログラムの他の部分をブロックしたくないためです。

Dart Future

Dartコミュニティは、 Future を「将来いつか価値を得るための手段」と定義しています。簡単に言うと、* Futureオブジェクト*は、実行が後で完了する式によって返される値を表すメカニズムです。 非同期メソッドが呼び出されると、Dartの組み込みクラスのいくつかは Future を返します。

Dartはシングルスレッドのプログラミング言語です。 コードが実行スレッドをブロックする場合(たとえば、時間のかかる操作を待機したり、I/Oをブロックしたりするなど)、プログラムは事実上フリーズします。

非同期操作により、ブロックされることなくプログラムを実行できます。 Dartは* Futureオブジェクト*を使用して非同期操作を表します。